diff -Nuar a/libdleyna/server/async.c b/libdleyna/server/async.c
--- a/libdleyna/server/async.c	2021-10-26 18:17:55.000000000 +0300
+++ b/libdleyna/server/async.c	2022-06-02 23:36:05.000000000 +0300
@@ -82,10 +82,6 @@
 {
 	dls_async_task_t *cb_data = user_data;
 
-	if (cb_data->proxy != NULL)
-		gupnp_service_proxy_cancel_action(cb_data->proxy,
-						  cb_data->action);
-
 	if (!cb_data->error)
 		cb_data->error = g_error_new(DLEYNA_SERVER_ERROR,
 					     DLEYNA_ERROR_CANCELLED,
diff -Nuar a/libdleyna/server/device.c b/libdleyna/server/device.c
--- a/libdleyna/server/device.c	2021-10-26 18:17:55.000000000 +0300
+++ b/libdleyna/server/device.c	2022-06-02 23:36:05.000000000 +0300
@@ -20,6 +20,8 @@
  *
  */
 
+#include <config.h>
+
 #include <string.h>
 #include <stdint.h>
 #include <stdio.h>
@@ -45,7 +47,7 @@
 #include <libdleyna/core/core.h>
 #include <libdleyna/core/error.h>
 #include <libdleyna/core/log.h>
-#include <libdleyna/core/service-task.h>
+#include <libdleyna/core/gasync-task.h>
 
 #include "device.h"
 #include "interface.h"
@@ -90,6 +92,7 @@
 struct dls_device_upload_t_ {
 	SoupSession *soup_session;
 	SoupMessage *msg;
+	GCancellable *cancellable;
 	GMappedFile *mapped_file;
 	gchar *body;
 	gsize body_length;
@@ -108,6 +111,7 @@
 typedef struct dls_device_download_t_ dls_device_download_t;
 struct dls_device_download_t_ {
 	SoupSession *session;
+	GCancellable *cancellable;
 	SoupMessage *msg;
 	dls_async_task_t *task;
 };
@@ -165,13 +169,12 @@
 static void prv_get_sr_token_for_props(GUPnPServiceProxy *proxy,
 			     const dls_device_t *device,
 			     dls_async_task_t *cb_data);
-static void prv_browse_objects_end_action_cb(GUPnPServiceProxy *proxy,
-					     GUPnPServiceProxyAction *action,
+static void prv_browse_objects_end_action_cb(GObject *target,
+					     GAsyncResult *res,
 					     gpointer user_data);
-static GUPnPServiceProxyAction *prv_browse_objects_begin_action_cb(
-						dleyna_service_task_t *task,
-						GUPnPServiceProxy *proxy,
-						gboolean *failed);
+static gboolean prv_browse_objects_begin_action_cb(
+						dleyna_gasync_task_t *task,
+						GObject *target);
 
 static void prv_get_sleeping_for_props(GUPnPServiceProxy *proxy,
 			     const dls_device_t *device,
@@ -375,7 +378,7 @@
 		g_variant_unref(dev->sort_ext_caps);
 		g_variant_unref(dev->feature_list);
 		g_free(dev->icon.mime_type);
-		g_free(dev->icon.bytes);
+		g_bytes_unref(dev->icon.bytes);
 		g_free(dev);
 	}
 }
@@ -1232,49 +1235,52 @@
 		g_error_free(error);
 }
 
-static void prv_get_feature_list_cb(GUPnPServiceProxy *proxy,
-				    GUPnPServiceProxyAction *action,
+static void prv_get_feature_list_cb(GObject *source, GAsyncResult *res,
 				    gpointer user_data)
 {
-	gchar *result = NULL;
-	gboolean end;
-	GError *error = NULL;
-	prv_new_device_ct_t *priv_t = (prv_new_device_ct_t *)user_data;
+	g_autofree gchar *result = NULL;
+	g_autoptr(GError) error = NULL;
+	dleyna_gasync_task_t *task = user_data;
+	prv_new_device_ct_t *priv_t =
+		(prv_new_device_ct_t *) dleyna_gasync_task_get_user_data(task);
+	g_autoptr(GUPnPServiceProxyAction) action = NULL;
+
+	action = gupnp_service_proxy_call_action_finish(
+		GUPNP_SERVICE_PROXY(source), res, &error);
+
+	if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+		return;
+	}
 
 	priv_t->dev->construct_step++;
-	end = gupnp_service_proxy_end_action(proxy, action, &error,
+	if (error == NULL) {
+		gupnp_service_proxy_action_get_result(action, &error,
 					     "FeatureList", G_TYPE_STRING,
 					     &result, NULL);
+	}
 
-	if (!end || (result == NULL)) {
+	if (error != NULL) {
 		DLEYNA_LOG_WARNING("GetFeatureList operation failed: %s",
-				   ((error != NULL) ? error->message
-						    : "Invalid result"));
-		goto on_error;
-	}
+				   error->message);
+	} else {
+		DLEYNA_LOG_DEBUG("GetFeatureList result: %s", result);
 
-	DLEYNA_LOG_DEBUG("GetFeatureList result: %s", result);
+		prv_get_feature_list_analyze(priv_t->dev, result);
+	}
 
-	prv_get_feature_list_analyze(priv_t->dev, result);
+	dleyna_task_queue_task_completed (((dleyna_task_atom_t *) task)->queue_id);
+}
 
-on_error:
-	if (error != NULL)
-		g_error_free(error);
+static gboolean prv_get_feature_list(dleyna_gasync_task_t *task, GObject *proxy)
+{
+	GUPnPServiceProxyAction *action =
+		gupnp_service_proxy_action_new("GetFeatureList", NULL);
 
-	g_free(result);
-}
+	gupnp_service_proxy_call_action_async(
+		GUPNP_SERVICE_PROXY(proxy), action, dleyna_gasync_task_get_cancellable(task),
+		prv_get_feature_list_cb, task);
 
-static GUPnPServiceProxyAction *prv_get_feature_list(
-						dleyna_service_task_t *task,
-						GUPnPServiceProxy *proxy,
-						gboolean *failed)
-{
-	*failed = FALSE;
-
-	return gupnp_service_proxy_begin_action(
-					proxy, "GetFeatureList",
-					dleyna_service_task_begin_action_cb,
-					task, NULL);
+	return FALSE;
 }
 
 static void prv_get_sort_ext_capabilities_analyze(dls_device_t *device,
@@ -1310,51 +1316,56 @@
 #endif
 }
 
-static void prv_get_sort_ext_capabilities_cb(GUPnPServiceProxy *proxy,
-					   GUPnPServiceProxyAction *action,
-					   gpointer user_data)
+static void prv_get_sort_ext_capabilities_cb(GObject *source, GAsyncResult *res,
+					     gpointer user_data)
 {
-	gchar *result = NULL;
-	gboolean end;
-	GError *error = NULL;
-	prv_new_device_ct_t *priv_t = (prv_new_device_ct_t *)user_data;
+	g_autofree gchar *result = NULL;
+	g_autoptr(GError) error = NULL;
+	dleyna_gasync_task_t *task = user_data;
+	prv_new_device_ct_t *priv_t =
+		(prv_new_device_ct_t *) dleyna_gasync_task_get_user_data(task);
+	g_autoptr(GUPnPServiceProxyAction) action;
 
-	priv_t->dev->construct_step++;
-	end = gupnp_service_proxy_end_action(proxy, action, &error,
-					     "SortExtensionCaps",
-					     G_TYPE_STRING, &result, NULL);
+	action = gupnp_service_proxy_call_action_finish(
+		GUPNP_SERVICE_PROXY(source), res, &error);
 
-	if (!end || (result == NULL)) {
-		DLEYNA_LOG_WARNING(
-			"GetSortExtensionCapabilities operation failed: %s",
-			((error != NULL) ? error->message : "Invalid result"));
-		goto on_error;
+	g_print("Sort ext\n");
+
+	if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+		return;
 	}
 
-	DLEYNA_LOG_DEBUG("GetSortExtensionCapabilities result: %s", result);
+	priv_t->dev->construct_step++;
 
-	prv_get_sort_ext_capabilities_analyze(priv_t->dev, result);
+	if (error == NULL) {
+		gupnp_service_proxy_action_get_result(action, &error, "SortCaps",
+						      G_TYPE_STRING, &result, NULL);
+	}
 
-on_error:
+	if (error!= NULL) {
+		DLEYNA_LOG_WARNING("GetSortCapabilitiesExt operation failed: %s",
+				   error->message);
 
-	if (error)
-		g_error_free(error);
+	} else {
+		DLEYNA_LOG_DEBUG("GetSortCapabilities result: %s", result);
 
-	g_free(result);
+		prv_get_sort_ext_capabilities_analyze(priv_t->dev, result);
+	}
+
+	dleyna_task_queue_task_completed (((dleyna_task_atom_t *) task)->queue_id);
 }
 
-static GUPnPServiceProxyAction *prv_get_sort_ext_capabilities(
-						dleyna_service_task_t *task,
-						GUPnPServiceProxy *proxy,
-						gboolean *failed)
-{
-	*failed = FALSE;
-
-	return gupnp_service_proxy_begin_action(
-					proxy,
-					"GetSortExtensionCapabilities",
-					dleyna_service_task_begin_action_cb,
-					task, NULL);
+static gboolean prv_get_sort_ext_capabilities(dleyna_gasync_task_t *task,
+					      GObject *target)
+{
+	GUPnPServiceProxyAction *action =
+		gupnp_service_proxy_action_new("GetSortExtensionCapabilities", NULL);
+	gupnp_service_proxy_call_action_async(
+		GUPNP_SERVICE_PROXY(target), action,
+		dleyna_gasync_task_get_cancellable(task),
+		prv_get_sort_ext_capabilities_cb, task);
+
+	return FALSE;
 }
 
 static void prv_get_capabilities_analyze(GHashTable *property_map,
@@ -1405,117 +1416,125 @@
 #endif
 }
 
-static void prv_get_sort_capabilities_cb(GUPnPServiceProxy *proxy,
-					 GUPnPServiceProxyAction *action,
+static void prv_get_sort_capabilities_cb(GObject *source,
+					 GAsyncResult *res,
 					 gpointer user_data)
 {
-	gchar *result = NULL;
-	gboolean end;
-	GError *error = NULL;
-	prv_new_device_ct_t *priv_t = (prv_new_device_ct_t *)user_data;
+	g_autofree gchar *result = NULL;
+	g_autoptr(GError) error = NULL;
+	dleyna_gasync_task_t *task = user_data;
+	prv_new_device_ct_t *priv_t = (prv_new_device_ct_t *) dleyna_gasync_task_get_user_data(task);
+	g_autoptr(GUPnPServiceProxyAction) action;
+
+	action = gupnp_service_proxy_call_action_finish(
+		GUPNP_SERVICE_PROXY(source), res, &error);
+	if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+		return;
+	}
 
 	priv_t->dev->construct_step++;
-	end = gupnp_service_proxy_end_action(proxy, action, &error, "SortCaps",
-					     G_TYPE_STRING, &result, NULL);
 
-	if (!end || (result == NULL)) {
-		DLEYNA_LOG_WARNING("GetSortCapabilities operation failed: %s",
-				   ((error != NULL) ? error->message
-						    : "Invalid result"));
-		goto on_error;
+	if (error == NULL) {
+		gupnp_service_proxy_action_get_result(action, &error, "SortCaps",
+					     G_TYPE_STRING, &result, NULL);
 	}
 
-	DLEYNA_LOG_DEBUG("GetSortCapabilities result: %s", result);
-
-	prv_get_capabilities_analyze(priv_t->property_map, result,
-				     &priv_t->dev->sort_caps);
+	if (error!= NULL) {
+		DLEYNA_LOG_WARNING("GetSortCapabilities operation failed: %s",
+				   error->message);
 
-on_error:
+	} else {
+		DLEYNA_LOG_DEBUG("GetSortCapabilities result: %s", result);
 
-	if (error)
-		g_error_free(error);
+		prv_get_capabilities_analyze(priv_t->property_map, result,
+					     &priv_t->dev->sort_caps);
+	}
 
-	g_free(result);
+	dleyna_task_queue_task_completed (((dleyna_task_atom_t *) task)->queue_id);
 }
 
-static GUPnPServiceProxyAction *prv_get_sort_capabilities(
-					dleyna_service_task_t *task,
-					GUPnPServiceProxy *proxy,
-					gboolean *failed)
-{
-	*failed = FALSE;
-
-	return gupnp_service_proxy_begin_action(
-					proxy,
-					"GetSortCapabilities",
-					dleyna_service_task_begin_action_cb,
-					task, NULL);
+static gboolean prv_get_sort_capabilities(dleyna_gasync_task_t *task,
+					  GObject *target)
+{
+	GUPnPServiceProxyAction *action =
+		gupnp_service_proxy_action_new("GetSortCapabilities", NULL);
+	gupnp_service_proxy_call_action_async(
+		GUPNP_SERVICE_PROXY(target), action,
+		dleyna_gasync_task_get_cancellable(task),
+		prv_get_sort_capabilities_cb, task);
+
+	return FALSE;
 }
 
-static void prv_get_search_capabilities_cb(GUPnPServiceProxy *proxy,
-					   GUPnPServiceProxyAction *action,
+static void prv_get_search_capabilities_cb(GObject *source,
+					   GAsyncResult *res,
 					   gpointer user_data)
 {
-	gchar *result = NULL;
-	gboolean end;
-	GError *error = NULL;
-	prv_new_device_ct_t *priv_t = (prv_new_device_ct_t *)user_data;
+	g_autofree gchar *result = NULL;
+	g_autoptr(GError) error = NULL;
+	dleyna_gasync_task_t *task = user_data;
+	prv_new_device_ct_t *priv_t =
+		(prv_new_device_ct_t *) dleyna_gasync_task_get_user_data(task);
+
+	g_autoptr(GUPnPServiceProxyAction) action =
+		gupnp_service_proxy_call_action_finish(
+			GUPNP_SERVICE_PROXY(source), res, &error);
+
+	if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+		return;
+	}
+
+	if (error == NULL) {
+		gupnp_service_proxy_action_get_result(
+			action, &error, "SearchCaps", G_TYPE_STRING, &result,
+			NULL);
+	}
 
 	priv_t->dev->construct_step++;
-	end = gupnp_service_proxy_end_action(proxy, action, &error,
-					     "SearchCaps", G_TYPE_STRING,
-					     &result, NULL);
-
-	if (!end || (result == NULL)) {
+	if (error != NULL) {
 		DLEYNA_LOG_WARNING("GetSearchCapabilities operation failed: %s",
-				   ((error != NULL) ? error->message
-						    : "Invalid result"));
-		goto on_error;
-	}
+				   error->message);
 
-	DLEYNA_LOG_DEBUG("GetSearchCapabilities result: %s", result);
+	} else {
+		DLEYNA_LOG_DEBUG("GetSearchCapabilities result: %s", result);
 
-	prv_get_capabilities_analyze(priv_t->property_map, result,
-				     &priv_t->dev->search_caps);
+		prv_get_capabilities_analyze(priv_t->property_map, result,
+					     &priv_t->dev->search_caps);
 
-	if (g_hash_table_lookup(priv_t->property_map, "upnp:objectUpdateID"))
-		priv_t->dev->has_last_change = TRUE;
+		if(g_hash_table_lookup(priv_t->property_map,
+				       "upnp:objectUpdateID"))
+			priv_t->dev->has_last_change = TRUE;
+	}
 
-on_error:
+	dleyna_task_queue_task_completed (((dleyna_task_atom_t *) task)->queue_id);
+}
 
-	if (error)
-		g_error_free(error);
+static gboolean prv_get_search_capabilities(
+					dleyna_gasync_task_t *task,
+					GObject *target)
+{
+	GUPnPServiceProxyAction *action =
+		gupnp_service_proxy_action_new("GetSearchCapabilities", NULL);
 
-	g_free(result);
+	gupnp_service_proxy_call_action_async(
+		GUPNP_SERVICE_PROXY(target), action, dleyna_gasync_task_get_cancellable(task),
+		prv_get_search_capabilities_cb, task);
+
+	return FALSE;
 }
 
-static GUPnPServiceProxyAction *prv_get_search_capabilities(
-					dleyna_service_task_t *task,
-					GUPnPServiceProxy *proxy,
-					gboolean *failed)
-{
-	*failed = FALSE;
-
-	return gupnp_service_proxy_begin_action(
-					proxy, "GetSearchCapabilities",
-					dleyna_service_task_begin_action_cb,
-					task, NULL);
-}
-
-static GUPnPServiceProxyAction *prv_subscribe(dleyna_service_task_t *task,
-					      GUPnPServiceProxy *proxy,
-					      gboolean *failed)
+static gboolean prv_subscribe(dleyna_gasync_task_t *task, GObject *target)
 {
 	dls_device_t *device;
 
-	device = (dls_device_t *)dleyna_service_task_get_user_data(task);
+	device = (dls_device_t *)dleyna_gasync_task_get_user_data(task);
 
 	device->construct_step++;
 	dls_device_subscribe_to_service_changes(device);
 
-	*failed = FALSE;
+	dleyna_task_queue_task_completed (((dleyna_task_atom_t *) task)->queue_id);
 
-	return NULL;
+	return FALSE;
 }
 
 static gboolean prv_subtree_interface_filter(const gchar *object_path,
@@ -1553,15 +1572,13 @@
 	return retval;
 }
 
-static GUPnPServiceProxyAction *prv_declare(dleyna_service_task_t *task,
-					    GUPnPServiceProxy *proxy,
-					    gboolean *failed)
+static gboolean prv_declare(dleyna_gasync_task_t *task, GObject *target)
 {
 	guint id;
 	dls_device_t *device;
 	prv_new_device_ct_t *priv_t;
 
-	priv_t = (prv_new_device_ct_t *)dleyna_service_task_get_user_data(task);
+	priv_t = (prv_new_device_ct_t *)dleyna_gasync_task_get_user_data(task);
 	device = priv_t->dev;
 	device->construct_step++;
 
@@ -1588,9 +1605,9 @@
 		DLEYNA_LOG_WARNING("dleyna_connector_publish_subtree FAILED");
 	}
 
-	*failed = (!id);
+	dleyna_task_queue_task_completed (((dleyna_task_atom_t *) task)->queue_id);
 
-	return NULL;
+	return !id;
 }
 
 void dls_device_construct(
@@ -1614,36 +1631,39 @@
 	priv_t->property_map = property_map;
 
 	s_proxy = context->cds.proxy;
+	GCancellable *cancellable = g_cancellable_new();
 
 	if (dev->construct_step < 1)
-		dleyna_service_task_add(queue_id, prv_get_search_capabilities,
-					s_proxy,
-					prv_get_search_capabilities_cb, NULL,
+		dleyna_gasync_task_add(queue_id,
+				       prv_get_search_capabilities,
+				       G_OBJECT(s_proxy),
+					cancellable,
+				       NULL,
 					priv_t);
 
 	if (dev->construct_step < 2)
-		dleyna_service_task_add(queue_id, prv_get_sort_capabilities,
-					s_proxy,
-					prv_get_sort_capabilities_cb, NULL,
-					priv_t);
+		dleyna_gasync_task_add(queue_id, prv_get_sort_capabilities,
+				       G_OBJECT(s_proxy), cancellable, NULL,
+				       priv_t);
 
 	if (dev->construct_step < 3)
-		dleyna_service_task_add(queue_id, prv_get_sort_ext_capabilities,
-					s_proxy,
-					prv_get_sort_ext_capabilities_cb, NULL,
+		dleyna_gasync_task_add(queue_id, prv_get_sort_ext_capabilities,
+				       G_OBJECT(s_proxy),
+					cancellable, NULL,
 					priv_t);
 
 	if (dev->construct_step < 4)
-		dleyna_service_task_add(queue_id, prv_get_feature_list, s_proxy,
-					prv_get_feature_list_cb, NULL, priv_t);
+		dleyna_gasync_task_add(queue_id, prv_get_feature_list,
+				       G_OBJECT(s_proxy), cancellable, NULL,
+				       priv_t);
 
 	/* The following task should always be completed */
-	dleyna_service_task_add(queue_id, prv_subscribe, s_proxy,
-				NULL, NULL, dev);
+	dleyna_gasync_task_add(queue_id, prv_subscribe, G_OBJECT(s_proxy),
+				cancellable, NULL, dev);
 
 	if (dev->construct_step < 6)
-		dleyna_service_task_add(queue_id, prv_declare, s_proxy,
-					NULL, g_free, priv_t);
+		dleyna_gasync_task_add(queue_id, prv_declare, G_OBJECT(s_proxy),
+					cancellable, g_free, priv_t);
 
 	dleyna_task_queue_start(queue_id);
 }
@@ -1885,32 +1905,35 @@
 		cb_task_data->get_children_cb(cb_data);
 }
 
-static void prv_get_children_cb(GUPnPServiceProxy *proxy,
-				GUPnPServiceProxyAction *action,
-				gpointer user_data)
+static void prv_get_children_cb(GObject *source, GAsyncResult *res, gpointer user_data)
 {
-	gchar *result = NULL;
-	const gchar *message;
-	gboolean end;
-	GUPnPDIDLLiteParser *parser = NULL;
-	GError *error = NULL;
+	g_autofree char *result = NULL;
+	g_autoptr(GUPnPDIDLLiteParser) parser = NULL;
+	g_autoptr(GError) error = NULL;
 	dls_async_task_t *cb_data = user_data;
 	dls_async_bas_t *cb_task_data = &cb_data->ut.bas;
+	g_autoptr(GUPnPServiceProxyAction) action = NULL;
 
 	DLEYNA_LOG_DEBUG("Enter");
 
-	end = gupnp_service_proxy_end_action(cb_data->proxy, cb_data->action,
-					     &error, "Result",
-					     G_TYPE_STRING, &result, NULL);
+	action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res,
+							&error);
+	if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+		return;
+	}
 
-	if (!end || (result == NULL)) {
-		message = (error != NULL) ? error->message : "Invalid result";
-		DLEYNA_LOG_WARNING("Browse operation failed: %s", message);
+	if(error == NULL) {
+		gupnp_service_proxy_action_get_result(
+			action, &error, "Result", G_TYPE_STRING, &result, NULL);
+	}
 
-		cb_data->error = g_error_new(DLEYNA_SERVER_ERROR,
-					     DLEYNA_ERROR_OPERATION_FAILED,
-					     "Browse operation failed: %s",
-					     message);
+	if(error != NULL) {
+		DLEYNA_LOG_WARNING("Browse operation failed: %s",
+				   error->message);
+
+		cb_data->error = g_error_new(
+			DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED,
+			"Browse operation failed: %s", error->message);
 		goto on_error;
 	}
 
@@ -1949,18 +1972,8 @@
 on_error:
 
 	(void) g_idle_add(dls_async_task_complete, cb_data);
-	g_cancellable_disconnect(cb_data->cancellable, cb_data->cancel_id);
 
 no_complete:
-
-	if (error)
-		g_error_free(error);
-
-	if (parser)
-		g_object_unref(parser);
-
-	g_free(result);
-
 	DLEYNA_LOG_DEBUG("Exit");
 }
 
@@ -1980,27 +1993,22 @@
 	g_object_add_weak_pointer((G_OBJECT(context->cds.proxy)),
 				  (gpointer *)&cb_data->proxy);
 
-	cb_data->action =
-		gupnp_service_proxy_begin_action(cb_data->proxy,
-						 "Browse",
-						 prv_get_children_cb,
-						 cb_data,
-						 "ObjectID", G_TYPE_STRING,
-						 task->target.id,
-
-						 "BrowseFlag", G_TYPE_STRING,
-						 "BrowseDirectChildren",
-
-						 "Filter", G_TYPE_STRING,
-						 upnp_filter,
-
-						 "StartingIndex", G_TYPE_INT,
-						 task->ut.get_children.start,
-						 "RequestedCount", G_TYPE_INT,
-						 task->ut.get_children.count,
-						 "SortCriteria", G_TYPE_STRING,
-						 sort_by,
-						 NULL);
+	cb_data->action = gupnp_service_proxy_action_new(
+		"Browse", "ObjectID", G_TYPE_STRING, task->target.id,
+
+		"BrowseFlag", G_TYPE_STRING, "BrowseDirectChildren",
+
+		"Filter", G_TYPE_STRING, upnp_filter,
+
+		"StartingIndex", G_TYPE_INT, task->ut.get_children.start,
+		"RequestedCount", G_TYPE_INT, task->ut.get_children.count,
+		"SortCriteria", G_TYPE_STRING, sort_by, NULL);
+
+	gupnp_service_proxy_call_action_async(cb_data->proxy,
+					      cb_data->action,
+					      cb_data->cancellable,
+					      prv_get_children_cb,
+					      cb_data);
 
 	cb_data->cancel_id = g_cancellable_connect(
 					cb_data->cancellable,
@@ -2142,32 +2150,34 @@
 	return subscribed;
 }
 
-static void prv_system_update_id_for_prop_cb(GUPnPServiceProxy *proxy,
-				    GUPnPServiceProxyAction *action,
-				    gpointer user_data)
+static void prv_system_update_id_for_prop_cb(GObject *source, GAsyncResult *res, gpointer user_data)
 {
-	GError *error = NULL;
-	const gchar *message;
-	gboolean end;
+	g_autoptr(GError) error = NULL;
 	guint id = G_MAXUINT32;
 	dls_async_task_t *cb_data = user_data;
+	g_autoptr(GUPnPServiceProxyAction) action = NULL;
 
 	DLEYNA_LOG_DEBUG("Enter");
 
-	end = gupnp_service_proxy_end_action(proxy, action, &error,
-					     "Id", G_TYPE_UINT, &id, NULL);
+	action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res,
+							&error);
+	if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+		return;
+	}
+
+	if(error == NULL) {
+		gupnp_service_proxy_action_get_result(action, &error, "Id",
+						      G_TYPE_UINT, &id, NULL);
+	}
 
-	if (!end || (id == G_MAXUINT32)) {
-		message = (error != NULL) ? error->message : "Invalid result";
+	if(error != NULL) {
 		DLEYNA_LOG_WARNING("Unable to retrieve SystemUpdateID: %s",
-				   message);
+				   error->message);
 
 		cb_data->error = g_error_new(
-					DLEYNA_SERVER_ERROR,
-					DLEYNA_ERROR_OPERATION_FAILED,
-					"Unable to retrieve SystemUpdateID: %s",
-					message);
-
+			DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED,
+			"Unable to retrieve SystemUpdateID: %s",
+			error->message);
 		goto on_complete;
 	}
 
@@ -2176,10 +2186,6 @@
 on_complete:
 
 	(void) g_idle_add(dls_async_task_complete, cb_data);
-	g_cancellable_disconnect(cb_data->cancellable, cb_data->cancel_id);
-
-	if (error)
-		g_error_free(error);
 
 	DLEYNA_LOG_DEBUG("Exit");
 }
@@ -2203,51 +2209,51 @@
 		goto on_complete;
 	}
 
-	cb_data->action = gupnp_service_proxy_begin_action(
-					proxy, "GetSystemUpdateID",
-					prv_system_update_id_for_prop_cb,
-					cb_data,
-					NULL);
+	cb_data->action = gupnp_service_proxy_action_new("GetSystemUpdateID", NULL);
 
 	cb_data->proxy = proxy;
 	g_object_add_weak_pointer((G_OBJECT(proxy)),
 				  (gpointer *)&cb_data->proxy);
 
-	cb_data->cancel_id = g_cancellable_connect(
-					cb_data->cancellable,
-					G_CALLBACK(dls_async_task_cancelled_cb),
-					cb_data, NULL);
+	gupnp_service_proxy_call_action_async(
+		proxy, cb_data->action, cb_data->cancellable,
+		prv_system_update_id_for_prop_cb, cb_data);
 
 on_complete:
 
 	DLEYNA_LOG_DEBUG("Exit");
 }
 
-static void prv_system_update_id_for_props_cb(GUPnPServiceProxy *proxy,
-				    GUPnPServiceProxyAction *action,
-				    gpointer user_data)
+static void prv_system_update_id_for_props_cb(GObject *source, GAsyncResult *res, gpointer user_data)
 {
-	GError *error = NULL;
-	const gchar *message;
-	gboolean end;
+	g_autoptr(GError) error = NULL;
 	guint id = G_MAXUINT32;
 	dls_async_task_t *cb_data = user_data;
 	dls_async_get_all_t *cb_task_data = &cb_data->ut.get_all;
+	g_autoptr(GUPnPServiceProxyAction) action = NULL;
+
 
 	DLEYNA_LOG_DEBUG("Enter");
 
-	end = gupnp_service_proxy_end_action(proxy, action, &error,
-					    "Id", G_TYPE_UINT, &id, NULL);
+	action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res,
+							&error);
+	if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+		return;
+	}
 
-	if (!end || (id == G_MAXUINT32)) {
-		message = (error != NULL) ? error->message : "Invalid result";
+	if(error == NULL) {
+		gupnp_service_proxy_action_get_result(action, &error, "Id",
+						      G_TYPE_UINT, &id, NULL);
+	}
+
+	if(error != NULL) {
 		DLEYNA_LOG_WARNING("Unable to retrieve SystemUpdateID: %s",
-				   message);
+				   error->message);
 
-		cb_data->error = g_error_new(DLEYNA_SERVER_ERROR,
-					     DLEYNA_ERROR_OPERATION_FAILED,
-					     "Unable to retrieve SystemUpdateID: %s",
-					     message);
+		cb_data->error = g_error_new(
+			DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED,
+			"Unable to retrieve SystemUpdateID: %s",
+			error->message);
 
 		goto on_complete;
 	}
@@ -2259,19 +2265,14 @@
 on_complete:
 
 	if (!cb_data->error)
-		prv_get_sr_token_for_props(proxy, cb_data->task.target.device,
+		prv_get_sr_token_for_props(GUPNP_SERVICE_PROXY (source), cb_data->task.target.device,
 					   cb_data);
 	else {
 		cb_data->task.result = g_variant_ref_sink(g_variant_builder_end(
 							cb_task_data->vb));
 		(void) g_idle_add(dls_async_task_complete, cb_data);
-		g_cancellable_disconnect(cb_data->cancellable,
-					 cb_data->cancel_id);
 	}
 
-	if (error)
-		g_error_free(error);
-
 	DLEYNA_LOG_DEBUG("Exit");
 }
 
@@ -2298,11 +2299,8 @@
 		goto on_complete;
 	}
 
-	cb_data->action = gupnp_service_proxy_begin_action(
-					proxy, "GetSystemUpdateID",
-					prv_system_update_id_for_props_cb,
-					cb_data,
-					NULL);
+	cb_data->action =
+		gupnp_service_proxy_action_new("GetSystemUpdateID", NULL);
 
 	if (cb_data->proxy != NULL)
 		g_object_remove_weak_pointer((G_OBJECT(cb_data->proxy)),
@@ -2310,15 +2308,13 @@
 
 	cb_data->proxy = proxy;
 
+	gupnp_service_proxy_call_action_async(
+		proxy, cb_data->action, cb_data->cancellable,
+		prv_system_update_id_for_props_cb, cb_data);
+
 	g_object_add_weak_pointer((G_OBJECT(proxy)),
 				  (gpointer *)&cb_data->proxy);
 
-	if (!cb_data->cancel_id)
-		cb_data->cancel_id = g_cancellable_connect(
-					cb_data->cancellable,
-					G_CALLBACK(dls_async_task_cancelled_cb),
-					cb_data, NULL);
-
 on_complete:
 
 	DLEYNA_LOG_DEBUG("Exit");
@@ -2341,34 +2337,36 @@
 	return subscribed;
 }
 
-static void prv_sleeping_for_props_cb(GUPnPServiceProxy *proxy,
-				      GUPnPServiceProxyAction *action,
-				      gpointer user_data)
+static void prv_sleeping_for_props_cb(GObject *source, GAsyncResult *res, gpointer user_data)
 {
-	GError *error = NULL;
-	const gchar *message;
-	gchar *info = NULL;
-	gboolean end;
+	g_autoptr(GError) error = NULL;
+	g_autofree gchar *info = NULL;
 	dls_async_task_t *cb_data = user_data;
 	dls_async_get_all_t *cb_task_data;
 	gboolean sleeping;
+	g_autoptr(GUPnPServiceProxyAction) action = NULL;
 
 	DLEYNA_LOG_DEBUG("Enter");
 
-	end = gupnp_service_proxy_end_action(proxy, action, &error,
-					     "NetworkInterfaceInfo",
-					     G_TYPE_STRING,
-					     &info, NULL);
+	action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res,
+							&error);
+	if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+		return;
+	}
 
-	if (!end || (info == NULL)) {
-		message = (error != NULL) ? error->message : "Invalid result";
+	if(error == NULL) {
+		gupnp_service_proxy_action_get_result(
+			action, &error, "NetworkInterfaceInfo", G_TYPE_STRING,
+			&info, NULL);
+	}
+
+	if (error != NULL) {
 		DLEYNA_LOG_WARNING("NetworkInterfaceInfo retrieval failed: %s",
-				   message);
+				   error->message);
 
-		cb_data->error = g_error_new(DLEYNA_SERVER_ERROR,
-					     DLEYNA_ERROR_OPERATION_FAILED,
-					     "GetInterfaceInfo failed: %s",
-					     message);
+		cb_data->error = g_error_new(
+			DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED,
+			"GetInterfaceInfo failed: %s", error->message);
 		goto on_complete;
 	}
 
@@ -2384,15 +2382,9 @@
 							     cb_task_data->vb));
 	}
 
-	g_free(info);
-
 on_complete:
 
 	(void) g_idle_add(dls_async_task_complete, cb_data);
-	g_cancellable_disconnect(cb_data->cancellable, cb_data->cancel_id);
-
-	if (error)
-		g_error_free(error);
 
 	DLEYNA_LOG_DEBUG("Exit");
 }
@@ -2421,27 +2413,25 @@
 		goto on_complete;
 	}
 
-	cb_data->action = gupnp_service_proxy_begin_action(
-					proxy, "GetInterfaceInfo",
-					prv_sleeping_for_props_cb,
-					cb_data,
-					NULL);
 
 	if (cb_data->proxy != NULL)
 		g_object_remove_weak_pointer((G_OBJECT(cb_data->proxy)),
 					     (gpointer *)&cb_data->proxy);
 
+	cb_data->action = gupnp_service_proxy_action_new ("GetInterfaceInfo", NULL);
+
+
+
 	cb_data->proxy = proxy;
 
 	g_object_add_weak_pointer((G_OBJECT(proxy)),
 				  (gpointer *)&cb_data->proxy);
 
-	if (!cb_data->cancel_id)
-		cb_data->cancel_id = g_cancellable_connect(
-					cb_data->cancellable,
-					G_CALLBACK(dls_async_task_cancelled_cb),
-					cb_data, NULL);
-
+	gupnp_service_proxy_call_action_async(
+		proxy, cb_data->action,
+		cb_data->cancellable,
+		prv_sleeping_for_props_cb,
+		cb_data);
 	return;
 
 on_complete:
@@ -2476,31 +2466,34 @@
 	return -1;
 }
 
-static void prv_service_reset_for_prop_cb(GUPnPServiceProxy *proxy,
-					  GUPnPServiceProxyAction *action,
-					  gpointer user_data)
+static void prv_service_reset_for_prop_cb(GObject *source, GAsyncResult *res, gpointer user_data)
 {
-	GError *error = NULL;
-	const gchar *message;
-	gchar *token = NULL;
-	gboolean end;
+	g_autoptr(GError) error = NULL;
+	g_autofree gchar *token = NULL;
 	dls_async_task_t *cb_data = user_data;
+	g_autoptr(GUPnPServiceProxyAction) action = NULL;
 
 	DLEYNA_LOG_DEBUG("Enter");
 
-	end = gupnp_service_proxy_end_action(proxy, action, &error,
-					     "ResetToken", G_TYPE_STRING,
+	action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res,
+							&error);
+	if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+		return;
+	}
+
+	if(error == NULL) {
+		gupnp_service_proxy_action_get_result(
+			action, &error,"ResetToken", G_TYPE_STRING,
 					     &token, NULL);
+	}
 
-	if (!end || (token == NULL)) {
-		message = (error != NULL) ? error->message : "Invalid result";
+	if (error != NULL) {
 		DLEYNA_LOG_WARNING("Unable to retrieve ServiceResetToken: %s",
-				   message);
+				   error->message);
 
-		cb_data->error = g_error_new(DLEYNA_SERVER_ERROR,
-					     DLEYNA_ERROR_OPERATION_FAILED,
-					     "GetServiceResetToken failed: %s",
-					     message);
+		cb_data->error = g_error_new(
+			DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED,
+			"GetServiceResetToken failed: %s", error->message);
 
 		goto on_complete;
 	}
@@ -2509,15 +2502,9 @@
 
 	DLEYNA_LOG_DEBUG("Service Reset %s", token);
 
-	g_free(token);
-
 on_complete:
 
 	(void) g_idle_add(dls_async_task_complete, cb_data);
-	g_cancellable_disconnect(cb_data->cancellable, cb_data->cancel_id);
-
-	if (error)
-		g_error_free(error);
 
 	DLEYNA_LOG_DEBUG("Exit");
 }
@@ -2538,65 +2525,59 @@
 		goto on_error;
 	}
 
-	cb_data->action = gupnp_service_proxy_begin_action(
-					proxy, "GetServiceResetToken",
-					prv_service_reset_for_prop_cb,
-					cb_data,
-					NULL);
 
 	cb_data->proxy = proxy;
 	g_object_add_weak_pointer((G_OBJECT(proxy)),
 				  (gpointer *)&cb_data->proxy);
 
-	cb_data->cancel_id = g_cancellable_connect(
-					cb_data->cancellable,
-					G_CALLBACK(dls_async_task_cancelled_cb),
-					cb_data, NULL);
+	cb_data->action = gupnp_service_proxy_action_new("GetServiceResetToken", NULL);
+
+	gupnp_service_proxy_call_action_async(
+		proxy, cb_data->action, cb_data->cancellable,
+		prv_service_reset_for_prop_cb, cb_data);
 
 on_error:
 
 	DLEYNA_LOG_DEBUG("Exit");
 }
 
-static void prv_service_reset_for_props_cb(GUPnPServiceProxy *proxy,
-					  GUPnPServiceProxyAction *action,
-					  gpointer user_data)
+static void prv_service_reset_for_props_cb(GObject *source, GAsyncResult *res, gpointer user_data)
 {
-	GError *error = NULL;
-	const gchar *message;
-	gchar *token = NULL;
-	gboolean end;
+	g_autoptr(GError) error = NULL;
+	g_autofree gchar *token = NULL;
 	dls_async_task_t *cb_data = user_data;
 	dls_async_get_all_t *cb_task_data;
+	g_autoptr(GUPnPServiceProxyAction) action = NULL;
 
 	DLEYNA_LOG_DEBUG("Enter");
 
 	cb_task_data = &cb_data->ut.get_all;
 
-	end = gupnp_service_proxy_end_action(proxy, action, &error,
-					    "ResetToken", G_TYPE_STRING,
-					    &token, NULL);
+	action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res,
+							&error);
+	if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+		return;
+	}
+	if(error == NULL) {
+		gupnp_service_proxy_action_get_result(
+			action, &error,"ResetToken", G_TYPE_STRING,
+			&token, NULL);
+	}
 
-	if (!end || (token == NULL)) {
-		message = (error != NULL) ? error->message : "Invalid result";
+	if (error != NULL) {
 		DLEYNA_LOG_WARNING("Unable to retrieve ServiceResetToken: %s",
-				   message);
+				   error->message);
+
+		cb_data->error = g_error_new(
+			DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED,
+			"GetServiceResetToken failed: %s", error->message);
 
-		cb_data->error = g_error_new(DLEYNA_SERVER_ERROR,
-					     DLEYNA_ERROR_OPERATION_FAILED,
-					     "GetServiceResetToken failed: %s",
-					     message);
 		goto on_complete;
 	}
 
-	g_variant_builder_add(cb_task_data->vb, "{sv}",
-			      DLS_INTERFACE_PROP_SV_SERVICE_RESET_TOKEN,
-			      g_variant_new_string(token));
 
 	DLEYNA_LOG_DEBUG("Service Reset %s", token);
 
-	g_free(token);
-
 on_complete:
 
 	if ((!cb_data->error) && (cb_task_data->proxy))
@@ -2608,13 +2589,8 @@
 							     cb_task_data->vb));
 
 		(void) g_idle_add(dls_async_task_complete, cb_data);
-		g_cancellable_disconnect(cb_data->cancellable,
-					 cb_data->cancel_id);
 	}
 
-	if (error)
-		g_error_free(error);
-
 	DLEYNA_LOG_DEBUG("Exit");
 }
 
@@ -2635,11 +2611,6 @@
 		goto on_exit; /* No error here, just skip the property */
 	}
 
-	cb_data->action = gupnp_service_proxy_begin_action(
-					proxy, "GetServiceResetToken",
-					prv_service_reset_for_props_cb,
-					cb_data,
-					NULL);
 
 	if (cb_data->proxy != NULL)
 		g_object_remove_weak_pointer((G_OBJECT(cb_data->proxy)),
@@ -2649,11 +2620,10 @@
 	g_object_add_weak_pointer((G_OBJECT(proxy)),
 				  (gpointer *)&cb_data->proxy);
 
-	if (!cb_data->cancel_id)
-		cb_data->cancel_id = g_cancellable_connect(
-					cb_data->cancellable,
-					G_CALLBACK(dls_async_task_cancelled_cb),
-					cb_data, NULL);
+	cb_data->action = gupnp_service_proxy_action_new("GetServiceResetToken", NULL);
+	gupnp_service_proxy_call_action_async(
+		proxy, cb_data->action, cb_data->cancellable,
+		prv_service_reset_for_props_cb, cb_data);
 
 on_exit:
 
@@ -2662,34 +2632,36 @@
 	return;
 }
 
-static void prv_sleeping_for_prop_cb(GUPnPServiceProxy *proxy,
-				     GUPnPServiceProxyAction *action,
-				     gpointer user_data)
+static void prv_sleeping_for_prop_cb(GObject *source, GAsyncResult *res, gpointer user_data)
 {
-	GError *error = NULL;
-	const gchar *message;
-	gchar *info = NULL;
-	gboolean end;
+	g_autoptr(GError) error = NULL;
+	g_autofree gchar *info = NULL;
 	dls_async_task_t *cb_data = user_data;
 	gboolean sleeping;
+	g_autoptr(GUPnPServiceProxyAction) action = NULL;
+
 
 	DLEYNA_LOG_DEBUG("Enter");
 
-	end = gupnp_service_proxy_end_action(proxy, action, &error,
-					     "NetworkInterfaceInfo",
-					     G_TYPE_STRING,
-					     &info, NULL);
+	action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res,
+							&error);
+	if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+		return;
+	}
 
-	if (!end || (info == NULL)) {
-		message = (error != NULL) ? error->message : "Invalid result";
-		DLEYNA_LOG_WARNING("NetworkInterfaceInfo retrieval failed: %s",
-				   message);
+	if(error == NULL) {
+		gupnp_service_proxy_action_get_result(
+			action, &error, "NetworkInterfaceInfo", G_TYPE_STRING,
+			&info, NULL);
+	}
 
-		cb_data->error = g_error_new(DLEYNA_SERVER_ERROR,
-					     DLEYNA_ERROR_OPERATION_FAILED,
-					     "GetInterfaceInfo failed: %s",
-					     message);
+	if (error != NULL) {
+		DLEYNA_LOG_WARNING("NetworkInterfaceInfo retrieval failed: %s",
+				   error->message);
 
+		cb_data->error = g_error_new(
+			DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED,
+			"GetInterfaceInfo failed: %s", error->message);
 		goto on_complete;
 	}
 
@@ -2700,15 +2672,9 @@
 					      g_variant_new_boolean(sleeping));
 	}
 
-	g_free(info);
-
 on_complete:
 
 	(void) g_idle_add(dls_async_task_complete, cb_data);
-	g_cancellable_disconnect(cb_data->cancellable, cb_data->cancel_id);
-
-	if (error)
-		g_error_free(error);
 
 	DLEYNA_LOG_DEBUG("Exit");
 }
@@ -2740,21 +2706,17 @@
 		goto on_complete;
 	}
 
-	cb_data->action = gupnp_service_proxy_begin_action(
-					proxy, "GetInterfaceInfo",
-					prv_sleeping_for_prop_cb,
-					cb_data,
-					NULL);
-
 	cb_data->proxy = proxy;
 
 	g_object_add_weak_pointer((G_OBJECT(proxy)),
-				  (gpointer *)&cb_data->proxy);
+				  (gpointer *) &cb_data->proxy);
+
+	cb_data->action =
+		gupnp_service_proxy_action_new("GetInterfaceInfo", NULL);
+	gupnp_service_proxy_call_action_async(
+		proxy, cb_data->action, cb_data->cancellable,
+		prv_sleeping_for_prop_cb, cb_data);
 
-	cb_data->cancel_id = g_cancellable_connect(
-					cb_data->cancellable,
-					G_CALLBACK(dls_async_task_cancelled_cb),
-					cb_data, NULL);
 on_complete:
 
 	DLEYNA_LOG_DEBUG("Exit");
@@ -2777,32 +2739,35 @@
 	return !cb_task_data->device_object;
 }
 
-static void prv_get_all_ms2spec_props_cb(GUPnPServiceProxy *proxy,
-					 GUPnPServiceProxyAction *action,
-					 gpointer user_data)
+static void prv_get_all_ms2spec_props_cb(GObject *source, GAsyncResult *res, gpointer user_data)
 {
-	GError *error = NULL;
-	const gchar *message;
-	gchar *result = NULL;
-	gboolean end;
-	GUPnPDIDLLiteParser *parser = NULL;
+	g_autoptr(GError) error = NULL;
+	g_autofree gchar *result = NULL;
+	g_autoptr(GUPnPDIDLLiteParser) parser = NULL;
 	dls_async_task_t *cb_data = user_data;
 	dls_async_get_all_t *cb_task_data = &cb_data->ut.get_all;
+	g_autoptr(GUPnPServiceProxyAction) action = NULL;
 
 	DLEYNA_LOG_DEBUG("Enter");
 
-	end = gupnp_service_proxy_end_action(cb_data->proxy, cb_data->action,
-					    &error, "Result",
-					    G_TYPE_STRING, &result, NULL);
+	action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res,
+							&error);
+	if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+		return;
+	}
 
-	if (!end || (result == NULL)) {
-		message = (error != NULL) ? error->message : "Invalid result";
-		DLEYNA_LOG_WARNING("Browse operation failed: %s", message);
+	if(error == NULL) {
+		gupnp_service_proxy_action_get_result(
+			action, &error, "Result", G_TYPE_STRING, &result, NULL);
+	}
 
-		cb_data->error = g_error_new(DLEYNA_SERVER_ERROR,
-					     DLEYNA_ERROR_OPERATION_FAILED,
-					     "Browse operation failed: %s",
-					     message);
+	if(error != NULL) {
+		DLEYNA_LOG_WARNING("Browse operation failed: %s",
+				   error->message);
+
+		cb_data->error = g_error_new(
+			DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED,
+			"Browse operation failed: %s", error->message);
 		goto on_error;
 	}
 
@@ -2847,7 +2812,7 @@
 		goto no_complete;
 	} else if (cb_data->task.type == DLS_TASK_GET_ALL_PROPS &&
 						cb_task_data->device_object) {
-		prv_get_system_update_id_for_props(proxy,
+		prv_get_system_update_id_for_props(GUPNP_SERVICE_PROXY(source),
 						   cb_data->task.target.device,
 						   cb_data);
 
@@ -2860,18 +2825,8 @@
 on_error:
 
 	(void) g_idle_add(dls_async_task_complete, cb_data);
-	g_cancellable_disconnect(cb_data->cancellable, cb_data->cancel_id);
 
 no_complete:
-
-	if (error)
-		g_error_free(error);
-
-	if (parser)
-		g_object_unref(parser);
-
-	g_free(result);
-
 	DLEYNA_LOG_DEBUG("Exit");
 }
 
@@ -2904,27 +2859,22 @@
 		goto on_error;
 	}
 
-	cb_data->action = gupnp_service_proxy_begin_action(
-				context->cds.proxy, "Browse",
-				prv_get_all_ms2spec_props_cb, cb_data,
-				"ObjectID", G_TYPE_STRING, task->target.id,
-				"BrowseFlag", G_TYPE_STRING, "BrowseMetadata",
-				"Filter", G_TYPE_STRING, "*",
-				"StartingIndex", G_TYPE_INT, 0,
-				"RequestedCount", G_TYPE_INT, 0,
-				"SortCriteria", G_TYPE_STRING,
-				"", NULL);
+	cb_data->action = gupnp_service_proxy_action_new(
+		"Browse", "ObjectID", G_TYPE_STRING, task->target.id,
+		"BrowseFlag", G_TYPE_STRING, "BrowseMetadata", "Filter",
+		G_TYPE_STRING, "*", "StartingIndex", G_TYPE_INT, 0,
+		"RequestedCount", G_TYPE_INT, 0, "SortCriteria", G_TYPE_STRING,
+		"", NULL);
+
+	gupnp_service_proxy_call_action_async(
+		context->cds.proxy, cb_data->action, cb_data->cancellable,
+		prv_get_all_ms2spec_props_cb, cb_data);
 
 	cb_data->proxy = context->cds.proxy;
 
 	g_object_add_weak_pointer((G_OBJECT(context->cds.proxy)),
 				  (gpointer *)&cb_data->proxy);
 
-	cb_data->cancel_id = g_cancellable_connect(
-					cb_data->cancellable,
-					G_CALLBACK(dls_async_task_cancelled_cb),
-					cb_data, NULL);
-
 	DLEYNA_LOG_DEBUG("Exit with SUCCESS");
 
 	return;
@@ -3096,33 +3046,34 @@
 	return TRUE;
 }
 
-static void prv_count_children_cb(GUPnPServiceProxy *proxy,
-				  GUPnPServiceProxyAction *action,
-				  gpointer user_data)
-{
+static void prv_count_children_cb(GObject *source, GAsyncResult *res, gpointer user_data){
 	dls_device_count_data_t *count_data = user_data;
 	dls_async_task_t *cb_data = count_data->cb_data;
-	GError *error = NULL;
-	const gchar *message;
+	g_autoptr(GError) error = NULL;
 	guint count = G_MAXUINT32;
 	gboolean complete = FALSE;
-	gboolean end;
+	g_autoptr(GUPnPServiceProxyAction) action = NULL;
 
 	DLEYNA_LOG_DEBUG("Enter");
 
-	end = gupnp_service_proxy_end_action(cb_data->proxy, cb_data->action,
-					    &error,
-					    "TotalMatches", G_TYPE_UINT, &count,
-					    NULL);
+	action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res,
+							&error);
+	if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+		return;
+	}
 
-	if (!end || (count == G_MAXUINT32)) {
-		message = (error != NULL) ? error->message : "Invalid result";
-		DLEYNA_LOG_WARNING("Browse operation failed: %s", message);
+	if(error == NULL) {
+		gupnp_service_proxy_action_get_result(action, &error, "TotalMatches",
+						      G_TYPE_UINT, &count, NULL);
+	}
 
-		cb_data->error = g_error_new(DLEYNA_SERVER_ERROR,
-					     DLEYNA_ERROR_OPERATION_FAILED,
-					     "Browse operation failed: %s",
-					     message);
+	if(error != NULL) {
+		DLEYNA_LOG_WARNING("Browse operation failed: %s",
+				   error->message);
+
+		cb_data->error = g_error_new(
+			DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED,
+			"Browse operation failed: %s", error->message);
 		goto on_error;
 	}
 
@@ -3134,13 +3085,8 @@
 
 	if (cb_data->error || complete) {
 		(void) g_idle_add(dls_async_task_complete, cb_data);
-		g_cancellable_disconnect(cb_data->cancellable,
-					 cb_data->cancel_id);
 	}
 
-	if (error)
-		g_error_free(error);
-
 	DLEYNA_LOG_DEBUG("Exit");
 }
 
@@ -3152,62 +3098,59 @@
 	DLEYNA_LOG_DEBUG("Enter");
 
 	prv_count_data_new(cb_data, cb, &count_data);
-	cb_data->action =
-		gupnp_service_proxy_begin_action(cb_data->proxy,
-						 "Browse",
-						 prv_count_children_cb,
-						 count_data,
-						 "ObjectID", G_TYPE_STRING, id,
-
-						 "BrowseFlag", G_TYPE_STRING,
-						 "BrowseDirectChildren",
+	cb_data->action = gupnp_service_proxy_action_new(
+		"Browse", "ObjectID", G_TYPE_STRING, id,
 
-						 "Filter", G_TYPE_STRING, "",
+		"BrowseFlag", G_TYPE_STRING, "BrowseDirectChildren",
 
-						 "StartingIndex", G_TYPE_INT,
-						 0,
+		"Filter", G_TYPE_STRING, "",
 
-						 "RequestedCount", G_TYPE_INT,
-						 1,
+		"StartingIndex", G_TYPE_INT, 0,
 
-						 "SortCriteria", G_TYPE_STRING,
-						 "",
+		"RequestedCount", G_TYPE_INT, 1,
 
-						 NULL);
+		"SortCriteria", G_TYPE_STRING, "", NULL);
 
+	gupnp_service_proxy_call_action_async(
+		cb_data->proxy, cb_data->action, cb_data->cancellable,
+		prv_count_children_cb, count_data);
 	DLEYNA_LOG_DEBUG("Exit with SUCCESS");
 }
 
-static void prv_get_ms2spec_prop_cb(GUPnPServiceProxy *proxy,
-				    GUPnPServiceProxyAction *action,
-				    gpointer user_data)
+static void prv_get_ms2spec_prop_cb(GObject *source, GAsyncResult *res, gpointer user_data)
 {
-	GError *error = NULL;
-	const gchar *message;
-	gchar *result = NULL;
-	gboolean end;
-	GUPnPDIDLLiteParser *parser = NULL;
+	g_autoptr(GError) error = NULL;
+	g_autofree gchar *result = NULL;
+	g_autoptr(GUPnPDIDLLiteParser) parser = NULL;
 	dls_async_task_t *cb_data = user_data;
 	dls_async_get_prop_t *cb_task_data = &cb_data->ut.get_prop;
 	dls_task_get_prop_t *task_data = &cb_data->task.ut.get_prop;
+	g_autoptr(GUPnPServiceProxyAction) action = NULL;
 
 	DLEYNA_LOG_DEBUG("Enter");
 
-	end = gupnp_service_proxy_end_action(cb_data->proxy, cb_data->action,
-					    &error, "Result",
-					    G_TYPE_STRING, &result, NULL);
+	action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res,
+							&error);
+	if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+		return;
+	}
 
-	if (!end || (result == NULL)) {
-		message = (error != NULL) ? error->message : "Invalid result";
-		DLEYNA_LOG_WARNING("Browse operation failed: %s", message);
+	if(error == NULL) {
+		gupnp_service_proxy_action_get_result(
+			action, &error, "Result", G_TYPE_STRING, &result, NULL);
+	}
 
-		cb_data->error = g_error_new(DLEYNA_SERVER_ERROR,
-					     DLEYNA_ERROR_OPERATION_FAILED,
-					     "Browse operation failed: %s",
-					     message);
+	if(error != NULL) {
+		DLEYNA_LOG_WARNING("Browse operation failed: %s",
+				   error->message);
+
+		cb_data->error = g_error_new(
+			DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED,
+			"Browse operation failed: %s", error->message);
 		goto on_error;
 	}
 
+
 	DLEYNA_LOG_DEBUG("GetMS2SpecProp result: %s", result);
 
 	parser = gupnp_didl_lite_parser_new();
@@ -3257,18 +3200,8 @@
 				    cb_data->task.target.id);
 	} else {
 		(void) g_idle_add(dls_async_task_complete, cb_data);
-		g_cancellable_disconnect(cb_data->cancellable,
-					 cb_data->cancel_id);
 	}
 
-	if (error)
-		g_error_free(error);
-
-	if (parser)
-		g_object_unref(parser);
-
-	g_free(result);
-
 	DLEYNA_LOG_DEBUG("Exit");
 }
 
@@ -3319,24 +3252,16 @@
 	g_object_add_weak_pointer((G_OBJECT(context->cds.proxy)),
 				  (gpointer *)&cb_data->proxy);
 
-	cb_data->action = gupnp_service_proxy_begin_action(
-			cb_data->proxy, "Browse",
-			prv_get_ms2spec_prop_cb,
-			cb_data,
-			"ObjectID", G_TYPE_STRING, cb_data->task.target.id,
-			"BrowseFlag", G_TYPE_STRING,
-			"BrowseMetadata",
-			"Filter", G_TYPE_STRING, filter,
-			"StartingIndex", G_TYPE_INT, 0,
-			"RequestedCount", G_TYPE_INT, 0,
-			"SortCriteria", G_TYPE_STRING,
-			"",
-			NULL);
-
-	cb_data->cancel_id = g_cancellable_connect(
-					cb_data->cancellable,
-					G_CALLBACK(dls_async_task_cancelled_cb),
-					cb_data, NULL);
+	cb_data->action = gupnp_service_proxy_action_new(
+		"Browse", "ObjectID", G_TYPE_STRING, cb_data->task.target.id,
+		"BrowseFlag", G_TYPE_STRING, "BrowseMetadata", "Filter",
+		G_TYPE_STRING, filter, "StartingIndex", G_TYPE_INT, 0,
+		"RequestedCount", G_TYPE_INT, 0, "SortCriteria", G_TYPE_STRING,
+		"", NULL);
+
+	gupnp_service_proxy_call_action_async(cb_data->proxy, cb_data->action,
+					      cb_data->cancellable,
+					      prv_get_ms2spec_prop_cb, cb_data);
 
 	DLEYNA_LOG_DEBUG("Exit with SUCCESS");
 
@@ -3552,35 +3477,38 @@
 	DLEYNA_LOG_DEBUG("Exit with FAIL");
 }
 
-static void prv_search_cb(GUPnPServiceProxy *proxy,
-			  GUPnPServiceProxyAction *action,
-			  gpointer user_data)
+static void prv_search_cb(GObject *source, GAsyncResult *res, gpointer user_data)
 {
-	gchar *result = NULL;
-	const gchar *message;
-	gboolean end;
+	g_autofree gchar *result = NULL;
 	guint count = G_MAXUINT32;
-	GUPnPDIDLLiteParser *parser = NULL;
-	GError *error = NULL;
+	g_autoptr(GUPnPDIDLLiteParser) parser = NULL;
+	g_autoptr(GError) error = NULL;
 	dls_async_task_t *cb_data = user_data;
 	dls_async_bas_t *cb_task_data = &cb_data->ut.bas;
+	g_autoptr(GUPnPServiceProxyAction) action = NULL;
+
 
 	DLEYNA_LOG_DEBUG("Enter");
 
-	end = gupnp_service_proxy_end_action(cb_data->proxy, cb_data->action,
-					     &error,
-					     "Result", G_TYPE_STRING, &result,
-					     "TotalMatches", G_TYPE_UINT,
-					     &count, NULL);
+	action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res,
+							&error);
+	if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+		return;
+	}
 
-	if (!end || (result == NULL) || (count == G_MAXUINT32)) {
-		message = (error != NULL) ? error->message : "Invalid result";
-		DLEYNA_LOG_WARNING("Search operation failed %s", message);
+	if(error == NULL) {
+		gupnp_service_proxy_action_get_result(
+			action, &error, "Result", G_TYPE_STRING, &result,
+			"TotalMatches", G_TYPE_UINT, &count, NULL);
+	}
 
-		cb_data->error = g_error_new(DLEYNA_SERVER_ERROR,
-					     DLEYNA_ERROR_OPERATION_FAILED,
-					     "Search operation failed: %s",
-					     message);
+	if(error != NULL) {
+		DLEYNA_LOG_WARNING("Search operation failed: %s",
+				   error->message);
+
+		cb_data->error = g_error_new(
+			DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED,
+			"Search operation failed: %s", error->message);
 		goto on_error;
 	}
 
@@ -3628,18 +3556,9 @@
 on_error:
 
 	(void) g_idle_add(dls_async_task_complete, cb_data);
-	g_cancellable_disconnect(cb_data->cancellable, cb_data->cancel_id);
 
 no_complete:
 
-	if (parser)
-		g_object_unref(parser);
-
-	g_free(result);
-
-	if (error)
-		g_error_free(error);
-
 	DLEYNA_LOG_DEBUG("Exit");
 }
 
@@ -3660,22 +3579,18 @@
 	g_object_add_weak_pointer((G_OBJECT(context->cds.proxy)),
 				  (gpointer *)&cb_data->proxy);
 
-	cb_data->action = gupnp_service_proxy_begin_action(
-			cb_data->proxy, "Search",
-			prv_search_cb,
-			cb_data,
-			"ContainerID", G_TYPE_STRING, task->target.id,
-			"SearchCriteria", G_TYPE_STRING, upnp_query,
-			"Filter", G_TYPE_STRING, upnp_filter,
-			"StartingIndex", G_TYPE_INT, task->ut.search.start,
-			"RequestedCount", G_TYPE_INT, task->ut.search.count,
-			"SortCriteria", G_TYPE_STRING, sort_by,
-			NULL);
 
-	cb_data->cancel_id = g_cancellable_connect(
-					cb_data->cancellable,
-					G_CALLBACK(dls_async_task_cancelled_cb),
-					cb_data, NULL);
+	cb_data->action = gupnp_service_proxy_action_new(
+		"Search", "ContainerID", G_TYPE_STRING, task->target.id,
+		"SearchCriteria", G_TYPE_STRING, upnp_query, "Filter",
+		G_TYPE_STRING, upnp_filter, "StartingIndex", G_TYPE_INT,
+		task->ut.search.start, "RequestedCount", G_TYPE_INT,
+		task->ut.search.count, "SortCriteria", G_TYPE_STRING, sort_by,
+		NULL);
+
+	gupnp_service_proxy_call_action_async(cb_data->proxy, cb_data->action,
+					      cb_data->cancellable,
+					      prv_search_cb, cb_data);
 
 	DLEYNA_LOG_DEBUG("Exit");
 }
@@ -3722,26 +3637,35 @@
 	g_variant_builder_add(bo->avb, "@a{sv}", gv_result);
 }
 
-static void prv_get_child_count_end_action_cb(GUPnPServiceProxy *proxy,
-					      GUPnPServiceProxyAction *action,
+static void prv_get_child_count_end_action_cb(GObject *source,
+					      GAsyncResult *res,
 					      gpointer user_data)
 {
-	GError *error = NULL;
-	const gchar *message;
+	g_autoptr(GError) error = NULL;
 	guint count = G_MAXUINT32;
-	gboolean end;
+	const char *message = NULL;
 	dls_async_browse_objects_t *cb_task_data;
-	dls_async_task_t *cb_data = user_data;
+	dls_async_task_t *cb_data = dleyna_gasync_task_get_user_data(user_data);
+	g_autoptr(GUPnPServiceProxyAction) action = NULL;
 
 	DLEYNA_LOG_DEBUG("Enter");
 
-	end = gupnp_service_proxy_end_action(proxy, action, &error,
-					     "TotalMatches", G_TYPE_UINT,
-					     &count, NULL);
+	action = gupnp_service_proxy_call_action_finish(
+		GUPNP_SERVICE_PROXY(source), res, &error);
 
-	cb_task_data = &((dls_async_task_t *)user_data)->ut.browse_objects;
+	if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+		return;
+	}
+
+	if (error == NULL) {
+		gupnp_service_proxy_action_get_result(action, &error,
+						      "TotalMatches", G_TYPE_UINT,
+						      &count, NULL);
+	}
 
-	if (!end || (count == G_MAXUINT32)) {
+	cb_task_data = &(cb_data)->ut.browse_objects;
+
+	if (error != NULL || count == G_MAXUINT32) {
 		message = (error != NULL) ? error->message : "Invalid result";
 		DLEYNA_LOG_WARNING("Browse operation failed: %s", message);
 
@@ -3777,34 +3701,29 @@
 	}
 
 	if (cb_task_data->index < cb_task_data->object_count)
-		dleyna_service_task_add(cb_task_data->queue_id,
-					prv_browse_objects_begin_action_cb,
-					proxy,
-					prv_browse_objects_end_action_cb,
-					NULL, user_data);
-
-	if (error)
-		g_error_free(error);
+		dleyna_gasync_task_add(
+			cb_task_data->queue_id,
+			prv_browse_objects_begin_action_cb, source,
+			dleyna_gasync_task_get_user_data(user_data), NULL,
+			cb_data);
 
 	DLEYNA_LOG_DEBUG("Exit");
 }
 
-static GUPnPServiceProxyAction *prv_get_child_count_begin_action_cb(
-						dleyna_service_task_t *task,
-						GUPnPServiceProxy *proxy,
-						gboolean *failed)
+static gboolean prv_get_child_count_begin_action_cb(dleyna_gasync_task_t *task,
+						    GObject *target)
 {
 	GUPnPServiceProxyAction *action;
 	dls_task_t *user_data;
 	const gchar *path;
-	gchar *root_path = NULL;
-	gchar *id = NULL;
+	g_autofree gchar *root_path = NULL;
+	g_autofree gchar *id = NULL;
 	dls_async_browse_objects_t *cb_task_data;
-	GError *error = NULL;
+	g_autoptr(GError) error = NULL;
 
 	DLEYNA_LOG_DEBUG("Enter");
 
-	user_data = (dls_task_t *)dleyna_service_task_get_user_data(task);
+	user_data = (dls_task_t *)dleyna_gasync_task_get_user_data(task);
 	cb_task_data = &((dls_async_task_t *)user_data)->ut.browse_objects;
 	path = cb_task_data->objects_id[cb_task_data->index - 1];
 
@@ -3814,9 +3733,7 @@
 	if (error != NULL)
 		goto exit;
 
-	action =  gupnp_service_proxy_begin_action(
-			proxy, "Browse",
-			dleyna_service_task_begin_action_cb, task,
+	action = gupnp_service_proxy_action_new ("Browse",
 			"ObjectID", G_TYPE_STRING, id,
 			"BrowseFlag", G_TYPE_STRING, "BrowseDirectChildren",
 			"Filter", G_TYPE_STRING, "",
@@ -3825,12 +3742,12 @@
 			"SortCriteria", G_TYPE_STRING, "",
 			NULL);
 
-	g_free(root_path);
-	g_free(id);
+	gupnp_service_proxy_call_action_async(
+		GUPNP_SERVICE_PROXY(target), action,
+		dleyna_gasync_task_get_cancellable(task),
+		prv_get_child_count_end_action_cb, task);
 
 exit:
-	*failed = FALSE;
-
 	if (error != NULL) {
 		DLEYNA_LOG_WARNING("%s: %s", path, error->message);
 		action = NULL;
@@ -3843,46 +3760,51 @@
 		}
 
 		if (cb_task_data->index < cb_task_data->object_count)
-			dleyna_service_task_add(
+			dleyna_gasync_task_add(
 					cb_task_data->queue_id,
 					prv_browse_objects_begin_action_cb,
-					proxy,
-					prv_browse_objects_end_action_cb,
+					target,
+					dleyna_gasync_task_get_cancellable(task),
 					NULL, user_data);
-		g_error_free(error);
 	}
 
-	return action;
+	return FALSE;
 }
 
-static void prv_browse_objects_end_action_cb(GUPnPServiceProxy *proxy,
-					     GUPnPServiceProxyAction *action,
+static void prv_browse_objects_end_action_cb(GObject *source,
+					     GAsyncResult *res,
 					     gpointer user_data)
 {
 	GError *error = NULL;
-	dls_async_task_t *cb_data = user_data;
+	dleyna_gasync_task_t *task = user_data;
+	dls_async_task_t *cb_data = dleyna_gasync_task_get_user_data(task);
 	dls_async_browse_objects_t *cb_task_data = &cb_data->ut.browse_objects;
 	dls_async_get_all_t *cb_all_data = &cb_data->ut.browse_objects.get_all;
 	GUPnPDIDLLiteParser *parser = NULL;
 	gchar *result = NULL;
-	const gchar *message;
-	gboolean end;
 
 	DLEYNA_LOG_DEBUG("Enter");
 
-	end = gupnp_service_proxy_end_action(proxy, action, &error,
-					     "Result", G_TYPE_STRING, &result,
-					     NULL);
+	g_autoptr(GUPnPServiceProxyAction) action;
 
-	if (!end || (result == NULL)) {
-		message = (error != NULL) ? error->message : "Invalid result";
+	action = gupnp_service_proxy_call_action_finish(
+		GUPNP_SERVICE_PROXY(source), res, &error);
+
+	if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+		return;
+	}
+
+	gupnp_service_proxy_action_get_result(action, &error, "Result",
+					      G_TYPE_STRING, &result, NULL);
+
+	if (error != NULL) {
 		DLEYNA_LOG_WARNING("Browse Object operation failed: %s",
-				   message);
+				   error->message);
 
 		cb_data->error = g_error_new(DLEYNA_SERVER_ERROR,
 					     DLEYNA_ERROR_OPERATION_FAILED,
 					     "Browse operation failed: %s",
-					     message);
+					     error->message);
 		goto on_exit;
 	}
 
@@ -3924,11 +3846,11 @@
 	if (cb_all_data->need_child_count &&
 	    (cb_all_data->filter_mask & DLS_UPNP_MASK_PROP_CHILD_COUNT)) {
 		DLEYNA_LOG_DEBUG("Need Child Count");
-		dleyna_service_task_add(cb_task_data->queue_id,
-					prv_get_child_count_begin_action_cb,
-					cb_data->proxy,
-					prv_get_child_count_end_action_cb,
-					NULL, cb_data);
+		dleyna_gasync_task_add(cb_task_data->queue_id,
+				       prv_get_child_count_begin_action_cb,
+				       G_OBJECT(cb_data->proxy),
+				       dleyna_gasync_task_get_cancellable(task),
+				       NULL, cb_data);
 		goto no_complete;
 	}
 
@@ -3938,7 +3860,7 @@
 on_exit:
 
 	if (cb_data->error != NULL) {
-		message = cb_task_data->objects_id[cb_task_data->index - 1];
+		const char *message = cb_task_data->objects_id[cb_task_data->index - 1];
 		prv_browse_objects_add_error_result(cb_task_data, message,
 						    cb_data->error);
 		g_error_free(cb_data->error);
@@ -3951,11 +3873,11 @@
 	}
 
 	if (cb_task_data->index < cb_task_data->object_count)
-		dleyna_service_task_add(cb_task_data->queue_id,
-					prv_browse_objects_begin_action_cb,
-					cb_data->proxy,
-					prv_browse_objects_end_action_cb,
-					NULL, cb_data);
+		dleyna_gasync_task_add(cb_task_data->queue_id,
+				       prv_browse_objects_begin_action_cb,
+				       G_OBJECT(cb_data->proxy),
+				       dleyna_gasync_task_get_cancellable(task),
+				       NULL, cb_data);
 no_complete:
 
 	if (parser)
@@ -3969,10 +3891,8 @@
 	DLEYNA_LOG_DEBUG("Exit");
 }
 
-static GUPnPServiceProxyAction *prv_browse_objects_begin_action_cb(
-						dleyna_service_task_t *task,
-						GUPnPServiceProxy *proxy,
-						gboolean *failed)
+static gboolean prv_browse_objects_begin_action_cb(dleyna_gasync_task_t *task,
+						   GObject *target)
 {
 	GUPnPServiceProxyAction *action;
 	dls_task_t *user_data;
@@ -3984,7 +3904,7 @@
 
 	DLEYNA_LOG_DEBUG("Enter called");
 
-	user_data = (dls_task_t *)dleyna_service_task_get_user_data(task);
+	user_data = (dls_task_t *)dleyna_gasync_task_get_user_data(task);
 	cb_task_data = &((dls_async_task_t *)user_data)->ut.browse_objects;
 	path = cb_task_data->objects_id[cb_task_data->index];
 
@@ -3999,22 +3919,22 @@
 
 	DLEYNA_LOG_DEBUG("Browse Metadata for path [id]: %s [%s]", path, id);
 
-	action = gupnp_service_proxy_begin_action(
-			proxy, "Browse",
-			dleyna_service_task_begin_action_cb, task,
-			"ObjectID", G_TYPE_STRING, id,
-			"BrowseFlag", G_TYPE_STRING, "BrowseMetadata",
-			"Filter", G_TYPE_STRING, cb_task_data->upnp_filter,
-			"StartingIndex", G_TYPE_INT, 0,
-			"RequestedCount", G_TYPE_INT, 0,
-			"SortCriteria", G_TYPE_STRING, "", NULL);
+	action = gupnp_service_proxy_action_new(
+		"Browse", "ObjectID", G_TYPE_STRING, id, "BrowseFlag",
+		G_TYPE_STRING, "BrowseMetadata", "Filter", G_TYPE_STRING,
+		cb_task_data->upnp_filter, "StartingIndex", G_TYPE_INT, 0,
+		"RequestedCount", G_TYPE_INT, 0, "SortCriteria", G_TYPE_STRING,
+		"", NULL);
+
+	gupnp_service_proxy_call_action_async(
+		GUPNP_SERVICE_PROXY(target), action,
+		dleyna_gasync_task_get_cancellable(task),
+		prv_browse_objects_end_action_cb, task);
 
 	g_free(root_path);
 	g_free(id);
 
 exit:
-	*failed = FALSE;
-
 	/* It's the ONLY place where index is incremented */
 	cb_task_data->index++;
 
@@ -4026,28 +3946,14 @@
 		g_error_free(error);
 
 		if (cb_task_data->index < cb_task_data->object_count)
-			dleyna_service_task_add(
-					cb_task_data->queue_id,
-					prv_browse_objects_begin_action_cb,
-					proxy,
-					prv_browse_objects_end_action_cb,
-					NULL, user_data);
+			dleyna_gasync_task_add(
+				cb_task_data->queue_id,
+				prv_browse_objects_begin_action_cb, target,
+				dleyna_gasync_task_get_cancellable(task), NULL,
+				user_data);
 	}
 
-	return action;
-}
-
-static void prv_browse_objects_chain_cancelled(GCancellable *cancellable,
-					       gpointer user_data)
-{
-	dls_async_task_t *cb_data = user_data;
-
-	DLEYNA_LOG_DEBUG("Enter");
-
-	dleyna_task_processor_cancel_queue(cb_data->ut.browse_objects.queue_id);
-	dls_async_task_cancelled_cb(cancellable, user_data);
-
-	DLEYNA_LOG_DEBUG("Exit");
+	return FALSE;
 }
 
 static void prv_browse_objects_chain_end(gboolean cancelled, gpointer data)
@@ -4108,12 +4014,12 @@
 
 	queue_id = dleyna_task_processor_add_queue(
 			dls_server_get_task_processor(),
-			dleyna_service_task_create_source(),
+			dleyna_gasync_task_create_source(),
 			DLS_SERVER_SINK,
 			DLEYNA_TASK_QUEUE_FLAG_AUTO_REMOVE,
-			dleyna_service_task_process_cb,
-			dleyna_service_task_cancel_cb,
-			dleyna_service_task_delete_cb);
+			dleyna_gasync_task_process_cb,
+			dleyna_gasync_task_cancel_cb,
+			dleyna_gasync_task_delete_cb);
 
 	dleyna_task_queue_set_finally(queue_id, prv_browse_objects_chain_end);
 	dleyna_task_queue_set_user_data(queue_id, task);
@@ -4130,16 +4036,9 @@
 	g_object_add_weak_pointer((G_OBJECT(context->cds.proxy)),
 				  (gpointer *)&cb_data->proxy);
 
-	cb_data->cancel_id = g_cancellable_connect(
-				cb_data->cancellable,
-				G_CALLBACK(prv_browse_objects_chain_cancelled),
-				cb_data, NULL);
-
-	dleyna_service_task_add(queue_id,
-				prv_browse_objects_begin_action_cb,
-				cb_data->proxy,
-				prv_browse_objects_end_action_cb,
-				NULL, cb_data);
+	dleyna_gasync_task_add(queue_id, prv_browse_objects_begin_action_cb,
+			       G_OBJECT(cb_data->proxy), cb_data->cancellable, NULL,
+			       cb_data);
 
 	dleyna_task_queue_start(queue_id);
 
@@ -4170,21 +4069,15 @@
 	g_object_add_weak_pointer((G_OBJECT(context->cds.proxy)),
 				  (gpointer *)&cb_data->proxy);
 
-	cb_data->action = gupnp_service_proxy_begin_action(
-				cb_data->proxy, "Browse",
-				prv_get_all_ms2spec_props_cb, cb_data,
-				"ObjectID", G_TYPE_STRING, task->target.id,
-				"BrowseFlag", G_TYPE_STRING, "BrowseMetadata",
-				"Filter", G_TYPE_STRING, upnp_filter,
-				"StartingIndex", G_TYPE_INT, 0,
-				"RequestedCount", G_TYPE_INT, 0,
-				"SortCriteria", G_TYPE_STRING,
-				"", NULL);
-
-	cb_data->cancel_id = g_cancellable_connect(
-					cb_data->cancellable,
-					G_CALLBACK(dls_async_task_cancelled_cb),
-					cb_data, NULL);
+	cb_data->action = gupnp_service_proxy_action_new(
+		"Browse", "ObjectID", G_TYPE_STRING, task->target.id,
+		"BrowseFlag", G_TYPE_STRING, "BrowseMetadata", "Filter",
+		G_TYPE_STRING, upnp_filter, "StartingIndex", G_TYPE_INT, 0,
+		"RequestedCount", G_TYPE_INT, 0, "SortCriteria", G_TYPE_STRING,
+		"", NULL);
+	gupnp_service_proxy_call_action_async(
+		cb_data->proxy, cb_data->action, cb_data->cancellable,
+		prv_get_all_ms2spec_props_cb, cb_data);
 
 	DLEYNA_LOG_DEBUG("Exit");
 }
@@ -4373,18 +4266,15 @@
 	}
 }
 
-static void prv_upload_delete_cb(GUPnPServiceProxy *proxy,
-				 GUPnPServiceProxyAction *action,
-				 gpointer user_data)
+static void prv_upload_delete_cb(GObject *source, GAsyncResult *res, gpointer user_data)
 {
 	dls_async_task_t *cb_data = user_data;
 
 	DLEYNA_LOG_DEBUG("Enter");
 
-	(void) gupnp_service_proxy_end_action(cb_data->proxy, cb_data->action,
-					      NULL, NULL);
+	gupnp_service_proxy_call_action_finish(cb_data->proxy, res, NULL);
+
 	(void) g_idle_add(dls_async_task_complete, cb_data);
-	g_cancellable_disconnect(cb_data->cancellable, cb_data->cancel_id);
 
 	DLEYNA_LOG_DEBUG("Exit");
 }
@@ -4447,18 +4337,25 @@
 					NULL);
 }
 
-static void prv_post_finished(SoupSession *session, SoupMessage *msg,
+static void prv_post_finished(GObject *source, GAsyncResult *res,
 			      gpointer user_data)
 {
 	dls_device_upload_job_t *upload_job = user_data;
 	dls_device_upload_t *upload;
 	gint *upload_id;
+	g_autoptr(GError) error = NULL;
+	g_autoptr(GBytes) data = NULL;
+	SoupMessage *msg = soup_session_get_async_result_message(
+		SOUP_SESSION(source), res);
 
 	DLEYNA_LOG_DEBUG("Enter");
 
 	DLEYNA_LOG_DEBUG("Upload %u finished.  Code %u Message %s",
-			 upload_job->upload_id, msg->status_code,
-			 msg->reason_phrase);
+			 upload_job->upload_id, soup_message_get_status(msg),
+			 soup_message_get_reason_phrase (msg));
+
+	data = soup_session_send_and_read_finish(SOUP_SESSION(source), res,
+						 &error);
 
 	/* This is clumsy but we need to distinguish between two cases:
 	   1. We cancel because the process is exitting.
@@ -4481,22 +4378,27 @@
 				     &upload_job->upload_id);
 	if (upload) {
 		upload_job->remove_idle =
-			g_timeout_add(30000, prv_remove_update_job, user_data);
+			g_timeout_add_seconds(30, prv_remove_update_job, user_data);
 
-		if (SOUP_STATUS_IS_SUCCESSFUL(msg->status_code)) {
-			upload->status = DLS_UPLOAD_STATUS_COMPLETED;
-			upload->bytes_uploaded = upload->bytes_to_upload;
-		} else if (msg->status_code == SOUP_STATUS_CANCELLED) {
+		// FIXME...
+		if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
 			upload->status = DLS_UPLOAD_STATUS_CANCELLED;
 		} else {
-			upload->status = DLS_UPLOAD_STATUS_ERROR;
+			SoupStatus status =
+				soup_message_get_status(upload->msg);
+			if(SOUP_STATUS_IS_SUCCESSFUL(status)) {
+				upload->status = DLS_UPLOAD_STATUS_COMPLETED;
+				upload->bytes_uploaded =
+					upload->bytes_to_upload;
+			} else {
+				upload->status = DLS_UPLOAD_STATUS_ERROR;
+			}
 		}
 
 		DLEYNA_LOG_DEBUG("Upload Status: %s", upload->status);
 
 		prv_generate_upload_update(upload_job, upload);
 
-		g_object_unref(upload->msg);
 		upload->msg = NULL;
 
 		g_object_unref(upload->soup_session);
@@ -4532,10 +4434,9 @@
 
 	if (upload) {
 		if (upload->msg) {
-			soup_session_cancel_message(upload->soup_session,
-						    upload->msg,
-						    SOUP_STATUS_CANCELLED);
+			g_cancellable_cancel(upload->cancellable);
 			g_object_unref(upload->msg);
+			g_object_unref(upload->cancellable);
 		}
 
 		if (upload->soup_session)
@@ -4552,12 +4453,12 @@
 	DLEYNA_LOG_DEBUG("Exit");
 }
 
-static void prv_post_bytes_written(SoupMessage *msg, SoupBuffer *chunk,
+static void prv_post_bytes_written(SoupMessage *msg, guint chunk_size,
 				   gpointer user_data)
 {
 	dls_device_upload_t *upload = user_data;
 
-	upload->bytes_uploaded += chunk->length;
+	upload->bytes_uploaded += chunk_size;
 	if (upload->bytes_uploaded > upload->bytes_to_upload)
 		upload->bytes_uploaded = upload->bytes_to_upload;
 }
@@ -4596,6 +4497,7 @@
 	upload = g_new0(dls_device_upload_t, 1);
 
 	upload->soup_session = soup_session_new();
+	upload->cancellable = g_cancellable_new();
 	upload->msg = soup_message_new("POST", import_uri);
 	upload->mapped_file = mapped_file;
 	upload->body = body;
@@ -4613,11 +4515,15 @@
 	upload->status = DLS_UPLOAD_STATUS_IN_PROGRESS;
 	upload->bytes_to_upload = up_body_length;
 
-	soup_message_headers_set_expectations(upload->msg->request_headers,
+	SoupMessageHeaders *headers =
+		soup_message_get_request_headers(upload->msg);
+	soup_message_headers_set_expectations(headers,
 					      SOUP_EXPECTATION_CONTINUE);
 
-	soup_message_set_request(upload->msg, mime_type, SOUP_MEMORY_STATIC,
-				 up_body, up_body_length);
+	GInputStream *is = g_memory_input_stream_new_from_data(
+		up_body, up_body_length, NULL);
+	soup_message_set_request_body(upload->msg, mime_type, is,
+				      up_body_length);
 	g_signal_connect(upload->msg, "wrote-body-data",
 			 G_CALLBACK(prv_post_bytes_written), upload);
 
@@ -4634,35 +4540,36 @@
 	return NULL;
 }
 
-static void prv_create_container_cb(GUPnPServiceProxy *proxy,
-		 GUPnPServiceProxyAction *action,
-		 gpointer user_data)
+static void prv_create_container_cb(GObject *source, GAsyncResult *res, gpointer user_data)
 {
 	dls_async_task_t *cb_data = user_data;
-	const gchar *message;
-	GError *error = NULL;
-	gchar *result = NULL;
-	gchar *object_id = NULL;
-	gchar *object_path;
-	gboolean end;
+	g_autoptr(GError) error = NULL;
+	g_autofree gchar *result = NULL;
+	g_autofree gchar *object_id = NULL;
+	g_autofree gchar *object_path = NULL;
+	g_autoptr(GUPnPServiceProxyAction) action = NULL;
 
 	DLEYNA_LOG_DEBUG("Enter");
 
-	end = gupnp_service_proxy_end_action(cb_data->proxy, cb_data->action,
-					     &error, "ObjectID",
-					     G_TYPE_STRING, &object_id,
-					     "Result", G_TYPE_STRING, &result,
-					     NULL);
+	action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res,
+							&error);
 
-	if (!end || (object_id == NULL)) {
-		message = (error != NULL) ? error->message : "Invalid result";
-		DLEYNA_LOG_WARNING("Create Object operation failed: %s",
-				   message);
+	if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+		return;
+	}
 
-		cb_data->error = g_error_new(DLEYNA_SERVER_ERROR,
-					     DLEYNA_ERROR_OPERATION_FAILED,
-					     "Create Object operation failed: %s",
-					     message);
+	if(error == NULL) {
+		gupnp_service_proxy_action_get_result(
+			action, &error, "ObjectID", G_TYPE_STRING, &object_id,
+			"Result", G_TYPE_STRING, &result, NULL);
+	}
+
+	if(error != NULL) {
+		DLEYNA_LOG_WARNING("Create Object operation failed: %s", error->message);
+
+		cb_data->error = g_error_new(
+			DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED,
+			"Create Object operation failed: %s", error->message);
 		goto on_error;
 	}
 
@@ -4670,59 +4577,56 @@
 				       object_id);
 	cb_data->task.result = g_variant_ref_sink(g_variant_new_object_path(
 								object_path));
-	g_free(object_path);
-
 on_error:
-
 	(void) g_idle_add(dls_async_task_complete, cb_data);
-	g_cancellable_disconnect(cb_data->cancellable, cb_data->cancel_id);
-
-	g_free(object_id);
-	g_free(result);
-
-	if (error)
-		g_error_free(error);
 
 	DLEYNA_LOG_DEBUG("Exit");
 }
 
-static void prv_generic_upload_cb(dls_async_task_t *cb_data,
-				  char *file_path,
-				  gchar *body,
-				  gsize body_length,
-				  const gchar *mime_type)
+static void prv_create_object_upload_cb(GObject *source, GAsyncResult *res,
+					gpointer user_data)
 {
-	gchar *object_id = NULL;
-	gchar *result = NULL;
+	dls_async_task_t *cb_data = user_data;
+	char *file_path = cb_data->task.ut.upload.file_path;
+	gchar *body = NULL;
+	gsize body_length = 0;
+	const gchar *mime_type = cb_data->ut.upload.mime_type;
+
 	gchar *import_uri = NULL;
-	gchar *object_path;
-	const gchar *message;
-	GError *error = NULL;
 	gboolean delete_needed = FALSE;
-	gboolean end;
 	gint *upload_id;
-	GUPnPDIDLLiteParser *parser = NULL;
+	g_autoptr(GUPnPDIDLLiteParser) parser = NULL;
 	GVariant *out_p[2];
 	dls_device_upload_t *upload;
 	dls_device_upload_job_t *upload_job;
+	g_autoptr(GError) error = NULL;
+	g_autofree gchar *result = NULL;
+	g_autofree gchar *object_id = NULL;
+	g_autofree gchar *object_path = NULL;
+	g_autoptr(GUPnPServiceProxyAction) action = NULL;
 
 	DLEYNA_LOG_DEBUG("Enter");
 
-	end = gupnp_service_proxy_end_action(cb_data->proxy, cb_data->action,
-					     &error, "ObjectID",
-					     G_TYPE_STRING, &object_id,
-					     "Result", G_TYPE_STRING, &result,
-					     NULL);
+	action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res,
+							&error);
+	if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+		return;
+	}
 
-	if (!end || (object_id == NULL) || (result == NULL)) {
-		message = (error != NULL) ? error->message : "Invalid result";
+	if(error == NULL) {
+		gupnp_service_proxy_action_get_result(
+			action, &error, "ObjectID", G_TYPE_STRING, &object_id,
+			"Result", G_TYPE_STRING, &result, NULL);
+	}
+
+	if(error != NULL) {
 		DLEYNA_LOG_WARNING("Create Object operation failed: %s",
-				   message);
+				   error->message);
+
+		cb_data->error = g_error_new(
+			DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED,
+			"Create Object operation failed: %s", error->message);
 
-		cb_data->error = g_error_new(DLEYNA_SERVER_ERROR,
-					     DLEYNA_ERROR_OPERATION_FAILED,
-					     "Create Object operation failed: %s",
-					     message);
 		goto on_error;
 	}
 
@@ -4771,9 +4675,9 @@
 	upload_job->device = cb_data->task.target.device;
 	upload_job->upload_id = (gint) cb_data->task.target.device->upload_id;
 
-	soup_session_queue_message(upload->soup_session, upload->msg,
-				   prv_post_finished, upload_job);
-	g_object_ref(upload->msg);
+	soup_session_send_and_read_async(
+		upload->soup_session, upload->msg, G_PRIORITY_DEFAULT,
+		upload->cancellable, prv_post_finished, upload_job);
 
 	upload_id = g_new(gint, 1);
 	*upload_id = upload_job->upload_id;
@@ -4796,8 +4700,6 @@
 	if (cb_data->task.target.device->upload_id > G_MAXINT)
 		cb_data->task.target.device->upload_id = 0;
 
-	g_free(object_path);
-
 on_error:
 
 	if (cb_data->error && delete_needed) {
@@ -4805,49 +4707,28 @@
 			"Upload failed deleting created object with id %s",
 			object_id);
 
-		cb_data->action = gupnp_service_proxy_begin_action(
-					cb_data->proxy, "DestroyObject",
-					prv_upload_delete_cb, cb_data,
-					"ObjectID", G_TYPE_STRING, object_id,
-					NULL);
+		cb_data->action = gupnp_service_proxy_action_new(
+			"DestroyObject", "ObjectID", G_TYPE_STRING, object_id,
+			NULL);
+		gupnp_service_proxy_call_action_async(
+			cb_data->proxy, cb_data->action, cb_data->cancellable,
+			prv_upload_delete_cb, cb_data);
+
+		// Fire and forget operation, we unref the action here.
+		gupnp_service_proxy_action_unref (cb_data->action);
 	} else {
 		(void) g_idle_add(dls_async_task_complete, cb_data);
-		g_cancellable_disconnect(cb_data->cancellable,
-					 cb_data->cancel_id);
 	}
 
-	g_free(object_id);
-	g_free(import_uri);
-
-	if (parser)
-		g_object_unref(parser);
-
-	g_free(result);
-
-	if (error)
-		g_error_free(error);
-
 	DLEYNA_LOG_DEBUG("Exit");
 }
 
-static void prv_create_object_upload_cb(GUPnPServiceProxy *proxy,
-					GUPnPServiceProxyAction *action,
-					gpointer user_data)
-{
-	dls_async_task_t *cb_data = user_data;
-
-	prv_generic_upload_cb(cb_data,
-			      cb_data->task.ut.upload.file_path,
-			      NULL, 0,
-			      cb_data->ut.upload.mime_type);
-}
-
 void dls_device_upload(dls_client_t *client,
 		       dls_task_t *task, const gchar *parent_id)
 {
 	dls_async_task_t *cb_data = (dls_async_task_t *)task;
 	dls_device_context_t *context;
-	gchar *didl;
+	g_autofree gchar *didl;
 	dls_async_upload_t *cb_task_data;
 
 	DLEYNA_LOG_DEBUG("Enter");
@@ -4869,19 +4750,13 @@
 	g_object_add_weak_pointer((G_OBJECT(context->cds.proxy)),
 				  (gpointer *)&cb_data->proxy);
 
-	cb_data->action = gupnp_service_proxy_begin_action(
-					cb_data->proxy, "CreateObject",
-					prv_create_object_upload_cb, cb_data,
-					"ContainerID", G_TYPE_STRING, parent_id,
-					"Elements", G_TYPE_STRING, didl,
-					NULL);
-
-	cb_data->cancel_id = g_cancellable_connect(
-					cb_data->cancellable,
-					G_CALLBACK(dls_async_task_cancelled_cb),
-					cb_data, NULL);
-
-	g_free(didl);
+	cb_data->action = gupnp_service_proxy_action_new(
+		"CreateObject", "ContainerID", G_TYPE_STRING, parent_id,
+		"Elements", G_TYPE_STRING, didl, NULL);
+
+	gupnp_service_proxy_call_action_async(
+		cb_data->proxy, cb_data->action, cb_data->cancellable,
+		prv_create_object_upload_cb, cb_data);
 
 	DLEYNA_LOG_DEBUG("Exit");
 }
@@ -4963,8 +4838,7 @@
 	}
 
 	if (upload->msg) {
-		soup_session_cancel_message(upload->soup_session, upload->msg,
-					    SOUP_STATUS_CANCELLED);
+		g_cancellable_cancel(upload->cancellable);
 		DLEYNA_LOG_DEBUG("Cancelling Upload %u ", upload_id);
 	}
 
@@ -4977,32 +4851,37 @@
 	return retval;
 }
 
-static void prv_destroy_object_cb(GUPnPServiceProxy *proxy,
-				  GUPnPServiceProxyAction *action,
-				  gpointer user_data)
+static void prv_destroy_object_cb(GObject *source, GAsyncResult *res, gpointer user_data)
 {
-	GError *upnp_error = NULL;
+	g_autoptr(GError) upnp_error = NULL;
 	dls_async_task_t *cb_data = user_data;
+	g_autoptr(GUPnPServiceProxyAction) action = NULL;
 
 	DLEYNA_LOG_DEBUG("Enter");
 
-	if (!gupnp_service_proxy_end_action(cb_data->proxy, cb_data->action,
-					    &upnp_error,
-					    NULL)) {
-		DLEYNA_LOG_WARNING("Destroy Object operation failed: %s",
+	action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res,
+							&upnp_error);
+
+	if(g_error_matches(upnp_error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+		return;
+	}
+
+	if(upnp_error == NULL) {
+		gupnp_service_proxy_action_get_result(action, &upnp_error,
+						      NULL);
+	}
+
+	if(upnp_error != NULL) {
+		DLEYNA_LOG_WARNING("Create Object operation failed: %s",
 				   upnp_error->message);
 
-		cb_data->error = g_error_new(DLEYNA_SERVER_ERROR,
-					     DLEYNA_ERROR_OPERATION_FAILED,
-					     "Destroy Object operation failed: %s",
-					     upnp_error->message);
+		cb_data->error = g_error_new(
+			DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED,
+			"Create Object operation failed: %s",
+			upnp_error->message);
 	}
 
 	(void) g_idle_add(dls_async_task_complete, cb_data);
-	g_cancellable_disconnect(cb_data->cancellable, cb_data->cancel_id);
-
-	if (upnp_error)
-		g_error_free(upnp_error);
 
 	DLEYNA_LOG_DEBUG("Exit");
 }
@@ -5022,15 +4901,12 @@
 	g_object_add_weak_pointer((G_OBJECT(context->cds.proxy)),
 				  (gpointer *)&cb_data->proxy);
 
-	cb_data->action = gupnp_service_proxy_begin_action(
-				cb_data->proxy, "DestroyObject",
-				prv_destroy_object_cb, cb_data,
-				"ObjectID", G_TYPE_STRING, task->target.id,
-				NULL);
-
-	cb_data->cancel_id = g_cancellable_connect(cb_data->cancellable,
-					G_CALLBACK(dls_async_task_cancelled_cb),
-					cb_data, NULL);
+	cb_data->action = gupnp_service_proxy_action_new(
+		"DestroyObject", "ObjectID", G_TYPE_STRING, task->target.id,
+		NULL);
+	gupnp_service_proxy_call_action_async(cb_data->proxy, cb_data->action,
+					      cb_data->cancellable,
+					      prv_destroy_object_cb, cb_data);
 
 	DLEYNA_LOG_DEBUG("Exit");
 }
@@ -5041,7 +4917,7 @@
 {
 	dls_async_task_t *cb_data = (dls_async_task_t *)task;
 	dls_device_context_t *context;
-	gchar *didl;
+	g_autofree gchar *didl = NULL;
 
 	DLEYNA_LOG_DEBUG("Enter");
 
@@ -5064,19 +4940,13 @@
 	g_object_add_weak_pointer((G_OBJECT(context->cds.proxy)),
 				  (gpointer *)&cb_data->proxy);
 
-	cb_data->action = gupnp_service_proxy_begin_action(
-					cb_data->proxy, "CreateObject",
-					prv_create_container_cb, cb_data,
-					"ContainerID", G_TYPE_STRING, parent_id,
-					"Elements", G_TYPE_STRING, didl,
-					NULL);
-
-	cb_data->cancel_id = g_cancellable_connect(
-					cb_data->cancellable,
-					G_CALLBACK(dls_async_task_cancelled_cb),
-					cb_data, NULL);
-
-	g_free(didl);
+	cb_data->action = gupnp_service_proxy_action_new(
+		"CreateObject", "ContainerID", G_TYPE_STRING, parent_id,
+		"Elements", G_TYPE_STRING, didl, NULL);
+
+	gupnp_service_proxy_call_action_async(cb_data->proxy, cb_data->action,
+					      cb_data->cancellable,
+					      prv_create_container_cb, cb_data);
 
 on_error:
 
@@ -5085,33 +4955,36 @@
 	return;
 }
 
-static void prv_update_object_update_cb(GUPnPServiceProxy *proxy,
-					GUPnPServiceProxyAction *action,
-					gpointer user_data)
+static void prv_update_object_update_cb(GObject *source, GAsyncResult *res, gpointer user_data)
 {
-	GError *upnp_error = NULL;
+	g_autoptr(GError) upnp_error = NULL;
 	dls_async_task_t *cb_data = user_data;
+	g_autoptr(GUPnPServiceProxyAction) action = NULL;
 
 	DLEYNA_LOG_DEBUG("Enter");
 
-	if (!gupnp_service_proxy_end_action(cb_data->proxy, cb_data->action,
-					    &upnp_error,
-					    NULL)) {
+	action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res,
+							&upnp_error);
+	if(g_error_matches(upnp_error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+		return;
+	}
+
+	if(upnp_error == NULL) {
+		gupnp_service_proxy_action_get_result(action, &upnp_error,
+						      NULL);
+	}
+
+	if(upnp_error != NULL) {
 		DLEYNA_LOG_WARNING("Update Object operation failed: %s",
 				   upnp_error->message);
 
-		cb_data->error = g_error_new(DLEYNA_SERVER_ERROR,
-					     DLEYNA_ERROR_OPERATION_FAILED,
-					     "Update Object operation "
-					     " failed: %s",
-					     upnp_error->message);
+		cb_data->error = g_error_new(
+			DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED,
+			"Update Object operation failed: %s",
+			upnp_error->message);
 	}
 
 	(void) g_idle_add(dls_async_task_complete, cb_data);
-	g_cancellable_disconnect(cb_data->cancellable, cb_data->cancel_id);
-
-	if (upnp_error)
-		g_error_free(upnp_error);
 
 	DLEYNA_LOG_DEBUG("Exit");
 }
@@ -5305,34 +5178,36 @@
 	DLEYNA_LOG_DEBUG("Exit");
 }
 
-static void prv_update_object_browse_cb(GUPnPServiceProxy *proxy,
-					GUPnPServiceProxyAction *action,
-					gpointer user_data)
+static void prv_update_object_browse_cb(GObject *source, GAsyncResult *res, gpointer user_data)
 {
-	GError *error = NULL;
+	g_autoptr(GError) error = NULL;
 	dls_async_task_t *cb_data = user_data;
 	dls_async_update_t *cb_task_data = &cb_data->ut.update;
-	GUPnPDIDLLiteParser *parser = NULL;
-	gchar *result = NULL;
-	const gchar *message;
-	gboolean end;
+	g_autoptr(GUPnPDIDLLiteParser) parser = NULL;
+	g_autofree gchar *result = NULL;
+	g_autoptr(GUPnPServiceProxyAction) action = NULL;
 
 	DLEYNA_LOG_DEBUG("Enter");
 
-	end = gupnp_service_proxy_end_action(cb_data->proxy, cb_data->action,
-					     &error,
-					     "Result", G_TYPE_STRING, &result,
-					     NULL);
+	action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res,
+							&error);
+	if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+		return;
+	}
 
-	if (!end || (result == NULL)) {
-		message = (error != NULL) ? error->message : "Invalid result";
-		DLEYNA_LOG_WARNING("Browse Object operation failed: %s",
-				   message);
+	if(error == NULL) {
+		gupnp_service_proxy_action_get_result(
+			action, &error, "Result", G_TYPE_STRING, &result, NULL);
+	}
+
+	if(error != NULL) {
+		DLEYNA_LOG_WARNING("Browse operation failed: %s",
+				   error->message);
+
+		cb_data->error = g_error_new(
+			DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED,
+			"Browse operation failed: %s", error->message);
 
-		cb_data->error = g_error_new(DLEYNA_SERVER_ERROR,
-					     DLEYNA_ERROR_OPERATION_FAILED,
-					     "Browse operation failed: %s",
-					     message);
 		goto on_error;
 	}
 
@@ -5367,32 +5242,24 @@
 		goto on_error;
 	}
 
-	cb_data->action = gupnp_service_proxy_begin_action(
-		cb_data->proxy, "UpdateObject",
-		prv_update_object_update_cb, cb_data,
-		"ObjectID", G_TYPE_STRING, cb_data->task.target.id,
-		"CurrentTagValue", G_TYPE_STRING,
-		cb_task_data->current_tag_value,
-		"NewTagValue", G_TYPE_STRING, cb_task_data->new_tag_value,
-		NULL);
+	cb_data->action = gupnp_service_proxy_action_new(
+		"UpdateObject", "ObjectID", G_TYPE_STRING,
+		cb_data->task.target.id, "CurrentTagValue", G_TYPE_STRING,
+		cb_task_data->current_tag_value, "NewTagValue", G_TYPE_STRING,
+		cb_task_data->new_tag_value, NULL);
+
+	gupnp_service_proxy_call_action_async(
+		cb_data->proxy, cb_data->action, cb_data->cancellable,
+		prv_update_object_update_cb, cb_data);
 
 	goto no_complete;
 
 on_error:
 
 	(void) g_idle_add(dls_async_task_complete, cb_data);
-	g_cancellable_disconnect(cb_data->cancellable, cb_data->cancel_id);
 
 no_complete:
 
-	if (parser)
-		g_object_unref(parser);
-
-	g_free(result);
-
-	if (error)
-		g_error_free(error);
-
 	DLEYNA_LOG_DEBUG("Exit");
 }
 
@@ -5412,50 +5279,48 @@
 	g_object_add_weak_pointer((G_OBJECT(context->cds.proxy)),
 				  (gpointer *)&cb_data->proxy);
 
-	cb_data->action = gupnp_service_proxy_begin_action(
-				cb_data->proxy, "Browse",
-				prv_update_object_browse_cb, cb_data,
-				"ObjectID", G_TYPE_STRING, task->target.id,
-				"BrowseFlag", G_TYPE_STRING, "BrowseMetadata",
-				"Filter", G_TYPE_STRING, upnp_filter,
-				"StartingIndex", G_TYPE_INT, 0,
-				"RequestedCount", G_TYPE_INT, 0,
-				"SortCriteria", G_TYPE_STRING,
-				"", NULL);
 
-	cb_data->cancel_id = g_cancellable_connect(cb_data->cancellable,
-					G_CALLBACK(dls_async_task_cancelled_cb),
-					cb_data, NULL);
+	cb_data->action = gupnp_service_proxy_action_new(
+		"Browse", "ObjectID", G_TYPE_STRING, task->target.id,
+		"BrowseFlag", G_TYPE_STRING, "BrowseMetadata", "Filter",
+		G_TYPE_STRING, upnp_filter, "StartingIndex", G_TYPE_INT, 0,
+		"RequestedCount", G_TYPE_INT, 0, "SortCriteria", G_TYPE_STRING,
+		"", NULL);
+
+	gupnp_service_proxy_call_action_async(
+		cb_data->proxy, cb_data->action, cb_data->cancellable,
+		prv_update_object_browse_cb, cb_data);
 
 	DLEYNA_LOG_DEBUG("Exit");
 }
 
-static void prv_get_object_metadata_cb(GUPnPServiceProxy *proxy,
-				       GUPnPServiceProxyAction *action,
-				       gpointer user_data)
+static void prv_get_object_metadata_cb(GObject *source, GAsyncResult *res, gpointer user_data)
 {
-	GError *error = NULL;
+	g_autoptr(GError) error = NULL;
 	dls_async_task_t *cb_data = user_data;
-	gchar *result = NULL;
-	const gchar *message;
-	gboolean end;
+	g_autofree gchar *result = NULL;
+	g_autoptr(GUPnPServiceProxyAction) action;
 
 	DLEYNA_LOG_DEBUG("Enter");
 
-	end = gupnp_service_proxy_end_action(cb_data->proxy, cb_data->action,
-					     &error,
-					     "Result", G_TYPE_STRING, &result,
-					     NULL);
+	action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res,
+							&error);
+	if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+		return;
+	}
 
-	if (!end || (result == NULL)) {
-		message = (error != NULL) ? error->message : "Invalid result";
-		DLEYNA_LOG_WARNING("Browse Object operation failed: %s",
-				   message);
+	if(error == NULL) {
+		gupnp_service_proxy_action_get_result(
+			action, &error, "Result", G_TYPE_STRING, &result, NULL);
+	}
 
-		cb_data->error = g_error_new(DLEYNA_SERVER_ERROR,
-					     DLEYNA_ERROR_OPERATION_FAILED,
-					     "Browse operation failed: %s",
-					     message);
+	if(error != NULL) {
+		DLEYNA_LOG_WARNING("Browse operation failed: %s",
+				   error->message);
+
+		cb_data->error = g_error_new(
+			DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED,
+			"Browse operation failed: %s", error->message);
 		goto on_complete;
 	}
 
@@ -5463,15 +5328,9 @@
 
 	DLEYNA_LOG_DEBUG("prv_get_object_metadata_cb result: %s", result);
 
-	g_free(result);
-
 on_complete:
 
 	(void) g_idle_add(dls_async_task_complete, cb_data);
-	g_cancellable_disconnect(cb_data->cancellable, cb_data->cancel_id);
-
-	if (error)
-		g_error_free(error);
 
 	DLEYNA_LOG_DEBUG("Exit");
 }
@@ -5492,52 +5351,50 @@
 	g_object_add_weak_pointer((G_OBJECT(context->cds.proxy)),
 				  (gpointer *)&cb_data->proxy);
 
-	cb_data->action = gupnp_service_proxy_begin_action(
-				cb_data->proxy, "Browse",
-				prv_get_object_metadata_cb, cb_data,
-				"ObjectID", G_TYPE_STRING, task->target.id,
-				"BrowseFlag", G_TYPE_STRING, "BrowseMetadata",
-				"Filter", G_TYPE_STRING, "*",
-				"StartingIndex", G_TYPE_INT, 0,
-				"RequestedCount", G_TYPE_INT, 0,
-				"SortCriteria", G_TYPE_STRING, "",
-				NULL);
+	cb_data->action = gupnp_service_proxy_action_new(
+		"Browse", "ObjectID", G_TYPE_STRING, task->target.id,
+		"BrowseFlag", G_TYPE_STRING, "BrowseMetadata", "Filter",
+		G_TYPE_STRING, "*", "StartingIndex", G_TYPE_INT, 0,
+		"RequestedCount", G_TYPE_INT, 0, "SortCriteria", G_TYPE_STRING,
+		"", NULL);
+
+	gupnp_service_proxy_call_action_async(
+		cb_data->proxy, cb_data->action, cb_data->cancellable,
+		prv_get_object_metadata_cb, cb_data);
 
-	cb_data->cancel_id = g_cancellable_connect(cb_data->cancellable,
-					G_CALLBACK(dls_async_task_cancelled_cb),
-					cb_data, NULL);
 
 	DLEYNA_LOG_DEBUG("Exit");
 }
 
-static void prv_create_reference_cb(GUPnPServiceProxy *proxy,
-				    GUPnPServiceProxyAction *action,
-				    gpointer user_data)
+static void prv_create_reference_cb(GObject *source, GAsyncResult *res, gpointer user_data)
 {
-	GError *error = NULL;
+	g_autoptr(GError) error = NULL;
 	dls_async_task_t *cb_data = user_data;
-	const gchar *message;
-	gchar *object_id = NULL;
-	gchar *object_path;
-	gboolean end;
+	g_autofree gchar *object_id = NULL;
+	g_autofree gchar *object_path = NULL;
+	g_autoptr(GUPnPServiceProxyAction) action;
 
 	DLEYNA_LOG_DEBUG("Enter");
 
-	end = gupnp_service_proxy_end_action(cb_data->proxy, cb_data->action,
-					    &error,
-					    "NewID", G_TYPE_STRING, &object_id,
-					    NULL);
-	if (!end || (object_id == NULL)) {
-		message = (error != NULL) ? error->message : "Invalid result";
-		DLEYNA_LOG_WARNING("CreateReference operation failed: %s",
-				   message);
+	action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res,
+							&error);
+	if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+		return;
+	}
 
-		cb_data->error = g_error_new(DLEYNA_SERVER_ERROR,
-					     DLEYNA_ERROR_OPERATION_FAILED,
-					     "Update Object operation "
-					     " failed: %s",
-					     message);
+	if(error == NULL) {
+		gupnp_service_proxy_action_get_result(action, &error, "NewID",
+						      G_TYPE_STRING, &object_id,
+						      NULL);
+	}
+
+	if(error != NULL) {
+		DLEYNA_LOG_WARNING("CreateReference operation failed: %s",
+				   error->message);
 
+		cb_data->error = g_error_new(
+			DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED,
+			"CreateReference operation failed: %s", error->message);
 		goto on_error;
 	}
 
@@ -5548,17 +5405,9 @@
 
 	cb_data->task.result = g_variant_ref_sink(g_variant_new_object_path(
 								object_path));
-	g_free(object_path);
-
 on_error:
 
 	(void) g_idle_add(dls_async_task_complete, cb_data);
-	g_cancellable_disconnect(cb_data->cancellable, cb_data->cancel_id);
-
-	g_free(object_id);
-
-	if (error != NULL)
-		g_error_free(error);
 
 	DLEYNA_LOG_DEBUG("Exit");
 }
@@ -5568,8 +5417,8 @@
 {
 	dls_async_task_t *cb_data = (dls_async_task_t *)task;
 	dls_device_context_t *context;
-	gchar *i_root = NULL;
-	gchar *i_id = NULL;
+	g_autofree gchar *i_root = NULL;
+	g_autofree gchar *i_id = NULL;
 	gchar *path = cb_data->task.ut.create_reference.item_path;
 
 	DLEYNA_LOG_DEBUG("Enter");
@@ -5594,23 +5443,15 @@
 	g_object_add_weak_pointer((G_OBJECT(context->cds.proxy)),
 				  (gpointer *)&cb_data->proxy);
 
-	cb_data->action = gupnp_service_proxy_begin_action(
-				cb_data->proxy, "CreateReference",
-				prv_create_reference_cb, cb_data,
-				"ContainerID", G_TYPE_STRING, task->target.id,
-				"ObjectID", G_TYPE_STRING, i_id,
-				NULL);
-
-	cb_data->cancel_id = g_cancellable_connect(
-					cb_data->cancellable,
-					G_CALLBACK(dls_async_task_cancelled_cb),
-					cb_data, NULL);
+	cb_data->action = gupnp_service_proxy_action_new(
+		"CreateReference", "ContainerID", G_TYPE_STRING,
+		task->target.id, "ObjectID", G_TYPE_STRING, i_id, NULL);
+
+	gupnp_service_proxy_call_action_async(cb_data->proxy, cb_data->action,
+					      cb_data->cancellable,
+					      prv_create_reference_cb, cb_data);
 
 on_error:
-
-	g_free(i_root);
-	g_free(i_id);
-
 	DLEYNA_LOG_DEBUG("Exit");
 }
 
@@ -5618,9 +5459,11 @@
 {
 	GVariant *out_p[2];
 
+	gsize size;
+	gconstpointer data = g_bytes_get_data(device->icon.bytes, &size);
 	out_p[0] = g_variant_new_fixed_array(G_VARIANT_TYPE_BYTE,
-					     device->icon.bytes,
-					     device->icon.size,
+					     data,
+					     size,
 					     1);
 	out_p[1] = g_variant_new_string(device->icon.mime_type);
 	task->result = g_variant_ref_sink(g_variant_new_tuple(out_p, 2));
@@ -5634,8 +5477,7 @@
 	dls_async_task_cancelled_cb(cancellable, download->task);
 
 	if (download->msg) {
-		soup_session_cancel_message(download->session, download->msg,
-					    SOUP_STATUS_CANCELLED);
+		g_cancellable_cancel(download->cancellable);
 		DLEYNA_LOG_DEBUG("Cancelling device icon download");
 	}
 }
@@ -5644,31 +5486,39 @@
 {
 	if (download->msg)
 		g_object_unref(download->msg);
+	if(download->cancellable)
+		g_object_unref(download->cancellable);
 	g_object_unref(download->session);
 	g_free(download);
 }
 
-static void prv_get_icon_session_cb(SoupSession *session,
-				    SoupMessage *msg,
+static void prv_get_icon_session_cb(GObject *source,
+				    GAsyncResult *res,
 				    gpointer user_data)
 {
 	dls_device_download_t *download = (dls_device_download_t *)user_data;
 	dls_async_task_t *cb_data = (dls_async_task_t *)download->task;
 	dls_device_t *device = (dls_device_t *)cb_data->task.target.device;
+	g_autoptr(GError) error = NULL;
+	GBytes *data;
+
+	data = soup_session_send_and_read_finish(SOUP_SESSION(source), res,
+						 &error);
 
-	if (msg->status_code == SOUP_STATUS_CANCELLED)
+	if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
 		goto out;
 
-	if (SOUP_STATUS_IS_SUCCESSFUL(msg->status_code)) {
-		device->icon.size = msg->response_body->length;
-		device->icon.bytes = g_malloc(device->icon.size);
-		memcpy(device->icon.bytes, msg->response_body->data,
-		       device->icon.size);
+	SoupStatus status = soup_message_get_status(download->msg);
+
+	if (SOUP_STATUS_IS_SUCCESSFUL(status)) {
+		device->icon.bytes = data;
 
 		prv_build_icon_result(device, &cb_data->task);
 	} else {
 		DLEYNA_LOG_DEBUG("Failed to GET device icon: %s",
-				 msg->reason_phrase);
+				 error != NULL
+					 ? error->message
+					 : soup_message_get_reason_phrase(download->msg));
 
 		cb_data->error = g_error_new(DLEYNA_SERVER_ERROR,
 					     DLEYNA_ERROR_OPERATION_FAILED,
@@ -5689,10 +5539,10 @@
 	dls_device_context_t *context;
 	dls_async_task_t *cb_data = (dls_async_task_t *)task;
 	dls_device_t *device = task->target.device;
-	gchar *url;
+	g_autofree gchar *url;
 	dls_device_download_t *download;
 
-	if (device->icon.size != 0) {
+	if (device->icon.bytes != NULL) {
 		prv_build_icon_result(device, task);
 		goto end;
 	}
@@ -5714,6 +5564,7 @@
 	download->session = soup_session_new();
 	download->msg = soup_message_new(SOUP_METHOD_GET, url);
 	download->task = cb_data;
+	download->cancellable = g_cancellable_new();
 
 	if (!download->msg) {
 		DLEYNA_LOG_WARNING("Invalid URL %s", url);
@@ -5732,11 +5583,9 @@
 				      G_CALLBACK(prv_get_icon_cancelled),
 				      download, NULL);
 
-	g_object_ref(download->msg);
-	soup_session_queue_message(download->session, download->msg,
-				   prv_get_icon_session_cb, download);
-
-	g_free(url);
+	soup_session_send_and_read_async(
+		download->session, download->msg, G_PRIORITY_DEFAULT,
+		download->cancellable, prv_get_icon_session_cb, download);
 
 	return;
 
diff -Nuar a/libdleyna/server/device.h b/libdleyna/server/device.h
--- a/libdleyna/server/device.h	2021-10-26 18:17:55.000000000 +0300
+++ b/libdleyna/server/device.h	2022-06-02 23:36:05.000000000 +0300
@@ -64,8 +64,7 @@
 typedef struct dls_device_icon_t_ dls_device_icon_t;
 struct dls_device_icon_t_ {
 	gchar *mime_type;
-	guchar *bytes;
-	gsize size;
+	GBytes *bytes;
 };
 
 struct dls_device_t_ {
diff -Nuar a/libdleyna/server/manager.c b/libdleyna/server/manager.c
--- a/libdleyna/server/manager.c	2021-10-26 18:17:55.000000000 +0300
+++ b/libdleyna/server/manager.c	2022-06-02 23:36:05.000000000 +0300
@@ -20,13 +20,14 @@
  *
  */
 
+#include <config.h>
+
 #include <glib.h>
 #include <string.h>
 
 #include <libdleyna/core/error.h>
 #include <libdleyna/core/log.h>
-#include <libdleyna/core/service-task.h>
-#include <libdleyna/core/white-list.h>
+#include <libdleyna/core/context-filter.h>
 
 #include "interface.h"
 #include "manager.h"
@@ -35,10 +36,10 @@
 struct dls_manager_t_ {
 	dleyna_connector_id_t connection;
 	GUPnPContextManager *cm;
-	dleyna_white_list_t *wl;
+	dleyna_context_filter_t *cf;
 };
 
-static void prv_wl_notify_prop(dls_manager_t *manager,
+static void prv_cf_notify_prop(dls_manager_t *manager,
 			       const gchar *prop_name,
 			       GVariant *prop_val)
 {
@@ -64,13 +65,13 @@
 			       GUPnPContextManager *connection_manager)
 {
 	dls_manager_t *manager = g_new0(dls_manager_t, 1);
-	GUPnPWhiteList *gupnp_wl;
+	GUPnPContextFilter *gupnp_cf;
 
-	gupnp_wl = gupnp_context_manager_get_white_list(connection_manager);
+	gupnp_cf = gupnp_context_manager_get_context_filter(connection_manager);
 
 	manager->connection = connection;
 	manager->cm = connection_manager;
-	manager->wl = dleyna_white_list_new(gupnp_wl);
+	manager->cf = dleyna_context_filter_new(gupnp_cf);
 
 	return manager;
 }
@@ -78,14 +79,14 @@
 void dls_manager_delete(dls_manager_t *manager)
 {
 	if (manager != NULL) {
-		dleyna_white_list_delete(manager->wl);
+		dleyna_context_filter_delete(manager->cf);
 		g_free(manager);
 	}
 }
 
-dleyna_white_list_t *dls_manager_get_white_list(dls_manager_t *manager)
+dleyna_context_filter_t *dls_manager_get_context_filter(dls_manager_t *manager)
 {
-	return manager->wl;
+	return manager->cf;
 }
 
 void dls_manager_get_all_props(dls_manager_t *manager,
@@ -188,7 +189,7 @@
 
 	if (*error == NULL) {
 		prop_val = g_variant_new_boolean(never_quit);
-		prv_wl_notify_prop(manager,
+		prv_cf_notify_prop(manager,
 				   DLS_INTERFACE_PROP_NEVER_QUIT,
 				   prop_val);
 	}
@@ -198,7 +199,7 @@
 	return;
 }
 
-static void prv_set_prop_wl_enabled(dls_manager_t *manager,
+static void prv_set_prop_cf_enabled(dls_manager_t *manager,
 				     dleyna_settings_t *settings,
 				     gboolean enabled,
 				     GError **error)
@@ -208,20 +209,20 @@
 
 	DLEYNA_LOG_DEBUG("Enter %d", enabled);
 
-	old_val = dleyna_settings_is_white_list_enabled(settings);
+	old_val = dleyna_settings_is_context_filter_enabled(settings);
 
 	if (old_val == enabled)
 		goto exit;
 
 	/* If no error, the white list will be updated in the reload callack
 	 */
-	dleyna_settings_set_white_list_enabled(settings, enabled, error);
+	dleyna_settings_set_context_filter_enabled(settings, enabled, error);
 
 	if (*error == NULL) {
-		dleyna_white_list_enable(manager->wl, enabled);
+		dleyna_context_filter_enable(manager->cf, enabled);
 
 		prop_val = g_variant_new_boolean(enabled);
-		prv_wl_notify_prop(manager,
+		prv_cf_notify_prop(manager,
 				   DLS_INTERFACE_PROP_WHITE_LIST_ENABLED,
 				   prop_val);
 	}
@@ -231,7 +232,7 @@
 	return;
 }
 
-static void prv_set_prop_wl_entries(dls_manager_t *manager,
+static void prv_set_prop_cf_entries(dls_manager_t *manager,
 				     dleyna_settings_t *settings,
 				     GVariant *entries,
 				     GError **error)
@@ -250,13 +251,13 @@
 	/* If no error, the white list will be updated in the reload callack
 	 * callack
 	 */
-	dleyna_settings_set_white_list_entries(settings, entries, error);
+	dleyna_settings_set_context_filter_entries(settings, entries, error);
 
 	if (*error == NULL) {
-		dleyna_white_list_clear(manager->wl);
-		dleyna_white_list_add_entries(manager->wl, entries);
+		dleyna_context_filter_clear(manager->cf);
+		dleyna_context_filter_add_entries(manager->cf, entries);
 
-		prv_wl_notify_prop(manager,
+		prv_cf_notify_prop(manager,
 				   DLS_INTERFACE_PROP_WHITE_LIST_ENTRIES,
 				   entries);
 	}
@@ -299,11 +300,11 @@
 					g_variant_get_boolean(param),
 					&error);
 	else if (!strcmp(name, DLS_INTERFACE_PROP_WHITE_LIST_ENABLED))
-		prv_set_prop_wl_enabled(manager, settings,
+		prv_set_prop_cf_enabled(manager, settings,
 					g_variant_get_boolean(param),
 					&error);
 	else if (!strcmp(name, DLS_INTERFACE_PROP_WHITE_LIST_ENTRIES))
-		prv_set_prop_wl_entries(manager, settings, param, &error);
+		prv_set_prop_cf_entries(manager, settings, param, &error);
 	else
 		cb_data->error = g_error_new(DLEYNA_SERVER_ERROR,
 					     DLEYNA_ERROR_UNKNOWN_PROPERTY,
diff -Nuar a/libdleyna/server/manager.h b/libdleyna/server/manager.h
--- a/libdleyna/server/manager.h	2021-10-26 18:17:55.000000000 +0300
+++ b/libdleyna/server/manager.h	2022-06-02 23:36:05.000000000 +0300
@@ -26,6 +26,7 @@
 #include <libdleyna/core/connector.h>
 #include <libdleyna/core/settings.h>
 #include <libgupnp/gupnp-context-manager.h>
+#include <libdleyna/core/context-filter.h>
 
 #include "task.h"
 
@@ -37,7 +38,7 @@
 
 void dls_manager_delete(dls_manager_t *manager);
 
-dleyna_white_list_t *dls_manager_get_white_list(dls_manager_t *manager);
+dleyna_context_filter_t *dls_manager_get_context_filter(dls_manager_t *manager);
 
 void dls_manager_get_all_props(dls_manager_t *manager,
 			       dleyna_settings_t *settings,
diff -Nuar a/libdleyna/server/meson.build b/libdleyna/server/meson.build
--- a/libdleyna/server/meson.build	2021-10-26 18:17:55.000000000 +0300
+++ b/libdleyna/server/meson.build	2022-06-02 23:36:05.000000000 +0300
@@ -62,7 +62,7 @@
     name: 'dleyna-server-service-1.0',
     description: 'UPnP & DLNA server library',
     version: meson.project_version(),
-    requires: ['gupnp-1.2', 'glib-2.0', 'gio-2.0', 'dleyna-core-1.0'],
+    requires: ['gupnp-1.6', 'glib-2.0', 'gio-2.0', 'dleyna-core-1.0'],
     install_dir: join_paths(get_option('prefix'), get_option('libdir'), 'pkgconfig')
 )
 
diff -Nuar a/libdleyna/server/props.c b/libdleyna/server/props.c
--- a/libdleyna/server/props.c	2021-10-26 18:17:55.000000000 +0300
+++ b/libdleyna/server/props.c	2022-06-02 23:36:05.000000000 +0300
@@ -2105,7 +2105,7 @@
 {
 	GVariant *result;
 
-	result = dleyna_settings_white_list_entries(settings);
+	result = dleyna_settings_context_filter_entries(settings);
 
 	if (result == NULL)
 		result = g_variant_new("as", NULL);
@@ -2119,7 +2119,7 @@
 			  dleyna_settings_is_never_quit(settings));
 
 	prv_add_bool_prop(vb, DLS_INTERFACE_PROP_WHITE_LIST_ENABLED,
-			  dleyna_settings_is_white_list_enabled(settings));
+			  dleyna_settings_is_context_filter_enabled(settings));
 
 	g_variant_builder_add(vb, "{sv}", DLS_INTERFACE_PROP_WHITE_LIST_ENTRIES,
 			      prv_build_wl_entries(settings));
@@ -2138,7 +2138,7 @@
 		b_value = dleyna_settings_is_never_quit(settings);
 		retval = g_variant_ref_sink(g_variant_new_boolean(b_value));
 	} else if (!strcmp(prop, DLS_INTERFACE_PROP_WHITE_LIST_ENABLED)) {
-		b_value = dleyna_settings_is_white_list_enabled(settings);
+		b_value = dleyna_settings_is_context_filter_enabled(settings);
 		retval = g_variant_ref_sink(g_variant_new_boolean(b_value));
 	} else if (!strcmp(prop, DLS_INTERFACE_PROP_WHITE_LIST_ENTRIES)) {
 		retval = g_variant_ref_sink(prv_build_wl_entries(settings));
diff -Nuar a/libdleyna/server/server.c b/libdleyna/server/server.c
--- a/libdleyna/server/server.c	2021-10-26 18:17:55.000000000 +0300
+++ b/libdleyna/server/server.c	2022-06-02 23:36:05.000000000 +0300
@@ -21,15 +21,17 @@
  *
  */
 
+#include <config.h>
+
 #include <glib.h>
 #include <string.h>
 
 #include <libdleyna/core/connector.h>
+#include <libdleyna/core/context-filter.h>
 #include <libdleyna/core/control-point.h>
 #include <libdleyna/core/error.h>
 #include <libdleyna/core/log.h>
 #include <libdleyna/core/task-processor.h>
-#include <libdleyna/core/white-list.h>
 
 #include "async.h"
 #include "client.h"
@@ -1293,21 +1295,21 @@
 	return g_context.upnp;
 }
 
-static void prv_white_list_init(void)
+static void prv_context_filter_init(void)
 {
 	gboolean enabled;
 	GVariant *entries;
-	dleyna_white_list_t *wl;
+	dleyna_context_filter_t *wl;
 
 	DLEYNA_LOG_DEBUG("Enter");
 
-	enabled = dleyna_settings_is_white_list_enabled(g_context.settings);
-	entries = dleyna_settings_white_list_entries(g_context.settings);
+	enabled = dleyna_settings_is_context_filter_enabled(g_context.settings);
+	entries = dleyna_settings_context_filter_entries(g_context.settings);
 
-	wl = dls_manager_get_white_list(g_context.manager);
+	wl = dls_manager_get_context_filter(g_context.manager);
 
-	dleyna_white_list_enable(wl, enabled);
-	dleyna_white_list_add_entries(wl, entries);
+	dleyna_context_filter_enable(wl, enabled);
+	dleyna_context_filter_add_entries(wl, entries);
 
 	DLEYNA_LOG_DEBUG("Exit");
 }
@@ -1340,7 +1342,7 @@
 						dls_upnp_get_context_manager(
 							g_context.upnp));
 
-		prv_white_list_init();
+		prv_context_filter_init();
 	} else {
 		retval = FALSE;
 	}
diff -Nuar a/libdleyna/server/upnp.c b/libdleyna/server/upnp.c
--- a/libdleyna/server/upnp.c	2021-10-26 18:17:55.000000000 +0300
+++ b/libdleyna/server/upnp.c	2022-06-02 23:36:05.000000000 +0300
@@ -20,6 +20,8 @@
  *
  */
 
+#include <config.h>
+
 #include <string.h>
 
 #include <libgssdp/gssdp-resource-browser.h>
@@ -28,7 +30,7 @@
 
 #include <libdleyna/core/error.h>
 #include <libdleyna/core/log.h>
-#include <libdleyna/core/service-task.h>
+#include <libdleyna/core/gasync-task.h>
 
 #include "async.h"
 #include "device.h"
@@ -123,12 +125,12 @@
 
 	queue_id = dleyna_task_processor_add_queue(
 			dls_server_get_task_processor(),
-			dleyna_service_task_create_source(),
+			dleyna_gasync_task_create_source(),
 			DLS_SERVER_SINK,
 			DLEYNA_TASK_QUEUE_FLAG_AUTO_REMOVE,
-			dleyna_service_task_process_cb,
-			dleyna_service_task_cancel_cb,
-			dleyna_service_task_delete_cb);
+			dleyna_gasync_task_process_cb,
+			dleyna_gasync_task_cancel_cb,
+			dleyna_gasync_task_delete_cb);
 	dleyna_task_queue_set_finally(queue_id, prv_device_chain_end);
 	dleyna_task_queue_set_user_data(queue_id, *priv_t);
 
@@ -212,7 +214,7 @@
 	udn = gupnp_device_info_get_udn(device_proxy);
 
 	ip_address = gssdp_client_get_host_ip(
-		GSSDP_CLIENT(gupnp_control_point_get_context(cp)));
+		gssdp_resource_browser_get_client(GSSDP_RESOURCE_BROWSER(cp)));
 
 	if (!udn || !ip_address)
 		goto on_error;
@@ -352,7 +354,7 @@
 	udn = gupnp_device_info_get_udn((GUPnPDeviceInfo *)proxy);
 
 	ip_address = gssdp_client_get_host_ip(
-		GSSDP_CLIENT(gupnp_control_point_get_context(cp)));
+		gssdp_resource_browser_get_client(GSSDP_RESOURCE_BROWSER(cp)));
 
 	if (!udn || !ip_address)
 		goto on_error;
diff -Nuar a/meson.build b/meson.build
--- a/meson.build	2021-10-26 18:17:55.000000000 +0300
+++ b/meson.build	2022-06-02 23:36:05.000000000 +0300
@@ -1,4 +1,4 @@
-project('dleyna-server', 'c', version: '0.7.2')
+project('dleyna-server', 'c', version: '0.8.0')
 
 pkg = import('pkgconfig')
 
@@ -67,12 +67,12 @@
 
 glib = dependency('glib-2.0', version: '>= 2.28')
 gio = dependency('gio-2.0', version: '>=2.28')
-gssdp = dependency('gssdp-1.2', version: '>= 1.2.0')
-gupnp = dependency('gupnp-1.2', version: '>= 1.2.0')
+gssdp = dependency('gssdp-1.6', version: '>= 1.2.0')
+gupnp = dependency('gupnp-1.6', version: '>= 1.2.0')
 gupnp_av = dependency('gupnp-av-1.0', version: '>= 0.12.9')
 gupnp_dlna = dependency('gupnp-dlna-2.0', version: '>= 0.9.4')
-soup = dependency('libsoup-2.4', version: '>= 2.28.2')
-dleyna_core = dependency('dleyna-core-1.0', version: '>= 0.6.0', fallback: 'dleyna-core-1.0')
+soup = dependency('libsoup-3.0', version: '>= 3.0')
+dleyna_core = dependency('dleyna-core-1.0', version: '>= 0.8.0', fallback: 'dleyna-core-1.0')
 libxml2 = dependency('libxml-2.0')
 
 cc = meson.get_compiler('c')
